attributes
attribute는 필수 기능도 아니고 컴파일러마다 다르게 정의되어있다. 하지만 C++ 개발을 더욱 안전하게 만들어주는 역할을 한다. 그 종류들은 다음과 같은 것들이 있다.

간단하고 유용한 몇 가지만 알아본다.
- [[nodiscard]]
[[nodiscard]]
// [[nodiscard("return value")]] // C++20 부터는 메시지를 추가할 수 있다.
int fn()
{
// return state or error code
return 0;
}
int main()
{
fn(); // 리턴값을 무시할 경우 warning 메시지가 출력된다.
}
만약, error code일 수 있는 return value가 너무 중요해서 fn() caller에서 꼭 확인해야한다면 return value를 꼭 체크하라는 attribute를 줄 수 있다.
- [[deprecated]]
[[deprecated]]
// [[deprecated("reason")]] // C++14 부터는 메시지를 추가할 수 있다.
int fn()
{
// return state or error code
return 0;
}
int main()
{
fn(); // 리턴값을 무시할 경우 warning 메시지가 출력된다.
}
함수를 잘 사용하고 있다가 더 이상 이 함수를 지원하지 않도록 결정할 수 있다. 회사 정책마다 다르겠지만 해당 함수를 바로 제거하는 것은 위험할 수 있다. 이럴 때, deprecated attribute를 사용해서 사용자에게 warning을 줄 수 있다.
- [[fallthrough]]
int main()
{
int n = 1;
switch (n)
{
case 1:
std::cout << "1" << std::endl;
[[fallthrough]] // break를 안 넣은 것은 의도된 것이라고 컴파일러에게 알려준다.
case 2:
std::cout << "2" << std::endl;
break;
default:
std::cout << "default" << std::endl;
break;
}
}
switch case 에서 사용하는 attribute이다. switch case에서 break라는 키워드를 가끔 빼먹는 경우가 있다. 이럴 때는 warning이 나올 수 있지만 이게 의도한 경우일 수도 있다. 그러면 break 위치에 [[fallthrough]] attribute를 줌으로써 경고를 표시하지 않도록 처리할 수 있다.
- [[maybe_unused]]
int main()
{
int debugN;
}
개발을 하다보면 디버그 목적의 변수를 만드는 경우가 있다. 디버그 컴파일시 사용되지만 릴리즈에서는 사용되지않는다. 이 때 릴리즈모드로 컴파일하면 warning이 뜨는데 매번 릴리즈 빌드마다 warning이 나오지 않게하는 것이 [[maybe_unused]] 이다.
여러개의 attribute 중 유용하고 간단한 것만 확인했다. 추가적으로 사용이 될만한 것들은 추후에 알아보면 되겠다.
'C++ > Modern C++' 카테고리의 다른 글
[C++17] std::optional (0) | 2022.10.31 |
---|---|
[C++] 가상함수 원리 (0) | 2022.10.24 |
[C++] Perfect forwarding (0) | 2022.10.05 |
[C++] constexpr (0) | 2022.10.05 |
스마트 포인터 문제 - 순환 참조 (0) | 2022.10.03 |