C++ 코드를 보다보니 [[ ~ ]] 와 같은 형식으로 작성된 부분 있었다.
뭔가 싶어서 검색해보니 컴파일러에게 코드에 대해서 좀 더 명확하게 힌트를 제공하는 기능이라고 한다.
그중에서 자주 사용할것 같은 attribute만 간단하게 정리해보고자 한다. (개인적인 기준;;)
1. [[nodiscard]] - C++17
이 attribute가 붙은 함수나 attibute가 붙은 enum, class등을 리턴하는 함수를 만들었다면
해당 함수를 호출할때는 리턴값을 받아야 한다고 컴파일러에 알려주는 것이다.
이는 컴파일 시점에 워닝으로 알려준다.
[[nodiscard]] int strategic_value(int x, int y) { return x^y; }
int main()
{
strategic_value(); // warning
auto v = strategic_value(); // ok
return 0;
}
[[nodiscard("string"]] - C++ 20은 워닝 메시지에 "string" 부분도 같이 남겨준다.
2. [[deprecated]] / [[deprecated("string") - C++14
해당 attribute가 붙은 함수를 사용하면 사용은 가능하지만 앞으로 제거될 수 있음을 워닝으로 알려준다.
엔진이나 라이브러리를 만들때 많이 사용될 것 같다.
언리얼 엔진에서도 버전업 하고 빌드해보면 나올때가 있다. 그러면 최신에 맞게 코드를 수정해주곤 한다.
[[deprecated]]
void TriassicPeriod() {
std::clog << "Triassic Period: [251.9 - 208.5] million years ago.\n";
}
int main()
{
TriassicPeriod(); // warning
return 0;
}
3. [[fallthrough]] - C++17
switch / case 문을 사용하다보면 fallthrough 기능을 사용하곤한다.
컴파일러에 따라서 해당 부분을 워닝처리할때가 있는데 컴파일러에 명확하게
내가 fallthrough를 한거니까 워닝처리를 하지 말라고 하는 것이다.
void f(int n) {
void g(), h(), i();
switch (n) {
case 1:
case 2:
g();
[[fallthrough]];
case 3: // no warning on fallthrough
..
}
}
몇가지 더 있기도 하고 추가될 예정인것 같지만 일단 이정도만 알고 사용해도 되지 않을까 싶다.
'프로그래밍 > C, C++' 카테고리의 다른 글
[C++20] std::format 사용해보기 (0) | 2021.09.24 |
---|---|
[C++] 스마트 포인터 unique_ptr 간단 정리 (0) | 2021.08.05 |
[C++11/C++17] 유니폼 초기화 (Uniform Initialization) (0) | 2021.07.30 |
[C++17] string_view 간단 정리 (0) | 2021.05.07 |
More Effective C++ - 항목5 ~ 항목8 (0) | 2018.04.01 |