_Noreturn 함수 지정자란?
C11 표준에서 도입된 _Noreturn 함수 지정자는 컴파일러에게 해당 함수가 실행된 후 호출자에게 제어권을 다시 반환하지 않는다는 사실을 알려주는 키워드입니다. 대표적으로 exit()나 abort()처럼 프로그램을 강제로 종료하는 함수들이 이에 해당합니다.
만약 _Noreturn으로 선언된 함수 내부에 return 문이 존재하면, 컴파일러는 컴파일 시점에 경고나 오류를 발생시킵니다.
잘못된 사용 예제
#include<stdio.h>
_Noreturn char function() {
return 'T'; // noreturn 함수에서 값 반환 시도
}
main() {
printf("반환된 값: %d\n", function());
}
출력 결과
프로그램이 비정상 종료됩니다
[경고] 'noreturn'으로 선언된 'function' 함수에 'return' 문이 있습니다
warning: function declared 'noreturn' has a 'return' statement
위 코드처럼 _Noreturn 함수 안에서 return 문을 사용하면 컴파일러가 이를 감지하여 경고 메시지를 출력하고, 프로그램은 비정상적으로 종료될 수 있습니다.
일반 함수와의 비교
반면, 일반적인 함수라면 아무런 제약 없이 값을 반환할 수 있으며 정상적으로 동작합니다.
올바른 예제 코드
#include<stdio.h>
int function() {
return 86; // 값을 정상적으로 반환
}
main() {
printf("반환된 값: %d\n", function());
}
출력 결과
반환된 값: 86
_Noreturn 활용 시 주의사항
_Noreturn함수는exit(),abort()호출이나 무한 루프 등 프로그램의 흐름을 종료하거나 멈추는 로직을 반드시 포함해야 합니다.- 함수가 실제로 반환되지 않음을 보장하지 못하면 정의되지 않은 동작(undefined behavior)이 발생할 수 있습니다.
- C++11 이상에서는 동일한 기능을 하는
[[noreturn]]속성(attribute)을 사용할 수 있습니다.