CodeNote
Coding Note
CodeNote
전체 방문자
오늘
어제
  • 전체 보기 (35)
    • C++ (33)
      • Modern C++ (12)
      • Modern C++ STL (0)
      • Thread (16)
      • Thread (Async) (5)
    • 디자인패턴 (0)
    • Algorithm (2)
    • Electron (0)
    • Python (0)

블로그 메뉴

  • 홈
  • Github
  • 태그
  • 방명록

공지사항

인기 글

태그

  • mutex
  • Free
  • LOCK
  • 자료구조
  • C++ #Memory
  • C++

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
CodeNote

Coding Note

[C++] attributes(속성)
C++/Modern C++

[C++] attributes(속성)

2022. 10. 13. 17:59

attributes

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

cppreference standard attributes

간단하고 유용한 몇 가지만 알아본다.

  • [[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
    'C++/Modern C++' 카테고리의 다른 글
    • [C++17] std::optional
    • [C++] 가상함수 원리
    • [C++] Perfect forwarding
    • [C++] constexpr
    CodeNote
    CodeNote
    기록 블로그

    티스토리툴바