`deprecated` 속성

deprecated 속성 (C23)

어떤 이름이나 엔티티를 더 이상 쓰지 않았으면 좋겠는데, 당장 없애면 기존 코드가 깨질 때가 있어요. 그럴 때 [[deprecated]] 속성을 붙여두면, 쓰는 건 허용하되 쓰지 말라는 신호를 남길 수 있어요. 컴파일러는 이걸 쓰는 코드에 보통 경고를 내줘요.

출처: cppreference

본문

[[deprecated]] 속성이 붙은 이름이나 엔티티의 사용은 허용되지만, 어떤 이유로 권장되지 않는다는 걸 나타내요. 컴파일러는 그런 사용에 대해 보통 경고를 내요. 문자열 리터럴을 지정했다면 그 내용이 경고에 함께 들어가는 게 보통이에요.

문법

[[deprecated]] / [[__deprecated__]] (1)
[[deprecated( string-literal )]] / [[__deprecated__( string-literal )]] (2)

string-literal은 deprecation의 이유나 대체할 엔티티를 설명하는 텍스트예요.

설명

이 속성은 다음 이름이나 엔티티의 선언에 쓸 수 있어요.

  • struct/union: struct [[deprecated]] S;
  • typedef 이름: [[deprecated]] typedef S* PS;
  • 객체: [[deprecated]] int x;
  • struct/union 멤버: union U { [[deprecated]] int n; };
  • 함수: [[deprecated]] void f(void);
  • 열거형: enum [[deprecated]] E {};
  • 열거자: enum { A [[deprecated]], B [[deprecated]] = 42 };

deprecated로 선언되지 않은 이름을 나중에 deprecated로 다시 선언하는 건 가능해요. 하지만 한번 deprecated로 선언된 이름을, 속성 없이 다시 선언해서 "미deprecated"로 되돌리는 건 불가능해요.

예시

지질시대를 출력하는 함수들에 [[deprecated]]를 붙여, 이제 쓰지 말라는 신호를 남겨봐요.

#include <stdio.h>

[[deprecated]]
void TriassicPeriod(void)
{
    puts("Triassic Period: [251.9 - 208.5] million years ago.");
}

[[deprecated("Use NeogenePeriod() instead.")]]
void JurassicPeriod(void)
{
    puts("Jurassic Period: [201.3 - 152.1] million years ago.");
}

[[deprecated("Use calcSomethingDifferently(int).")]]
int calcSomething(int x)
{
    return x * 2;
}

int main(void)
{
    TriassicPeriod();
    JurassicPeriod();
}

가능한 출력:

Triassic Period: [251.9 - 208.5] million years ago.
Jurassic Period: [201.3 - 152.1] million years ago.

prog.c:23:5: warning: 'TriassicPeriod' is deprecated [-Wdeprecated-declarations]
    TriassicPeriod();
    ^
prog.c:3:3: note: 'TriassicPeriod' has been explicitly marked deprecated here
[[deprecated]]
  ^
prog.c:24:5: warning: 'JurassicPeriod' is deprecated: Use NeogenePeriod() instead. [-Wdeprecated-declarations]
    JurassicPeriod();
    ^
prog.c:9:3: note: 'JurassicPeriod' has been explicitly marked deprecated here
[[deprecated("Use NeogenePeriod() instead.")]]
  ^
2 warnings generated.

[[deprecated]]만 붙이면 "이건 deprecated야" 정도의 경고가 나오고, 문자열을 함께 주면 그 이유가 경고에 실려서 나와요. 덕분에 쓸 일이 있더라도 왜 새 함수로 바꿔야 하는지 바로 알 수 있어요.

더 알아보기

  • [[deprecated]]와 짝을 이루는 [[maybe_unused]], [[fallthrough]] 같은 다른 속성도 확인해 보세요.
  • C23의 속성 전반은 attributes 문서에서 다뤄요.
  • cppreference의 deprecated 원문을 참고할 수 있어요.