`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 원문을 참고할 수 있어요.