`noreturn` 속성 — 돌아오지 않는 함수

noreturn 속성 — 돌아오지 않는 함수

함수라고 해서 전부 값을 돌려주고 끝나는 건 아니에요. 프로그램을 종료하는 exit(), 점프를 수행하는 longjmp()처럼 호출한 뒤 제어가 절대 호출자에게 돌아오지 않는 함수도 있어요. [[noreturn]] 속성은 바로 그 "이 함수는 끝까지 실행해도 함수 끝에 도달하지 않는다"는 사실을 컴파일러에 알려주는 장치예요.

출처: cppreference

본문

문법(Syntax)

[[noreturn]]              (1)
[[__noreturn__]]          (1)
[[_Noreturn]]             (2, deprecated)
[[___Noreturn__]]         (2, deprecated)

설명(Explanation)

이 속성은 함수가 반환하지 않음을 나타내요. 함수의 이름에 적용되며, 그 함수가 return 문을 실행하거나 함수 본문의 끝에 도달함으로써는 반환하지 않는다는 뜻이에요. 다만 longjmp를 실행해 반환하는 것은 가능해요.

이 속성이 붙은 함수가 실제로 반환하면 그 동작은 미정의(undefined behavior)예요. 컴파일러가 이를 감지할 수 있다면 진단을 내리도록 권장돼요.

이전에는 _Noreturn이라는 키워드로 표기했어요. C23부터 _Noreturn이 폐기(deprecated)되고 이 속성으로 대체됐어요.

표준 라이브러리

다음 표준 함수들은 noreturn 속성으로 선언돼 있어요(이전에는 _Noreturn 지정자로 선언됐었죠).

  • abort()
  • exit()
  • _Exit()
  • quick_exit()
  • thrd_exit()
  • longjmp()

더 알아보기

  • [[nodiscard]] 속성과 함께 C23 속성의 대표적인 두 쓰임새예요.
  • _Noreturn 키워드에 대한 세부 문서도 함께 보면 이전 표기와의 관계가 분명해져요.