본문 바로가기
프로그래밍/C

C/C++ ] 리턴하지 않는 함수임을 명시하는 키워드

by eteo 2025. 11. 27.
반응형

 

 

리턴하지 않는 함수의 의미

리턴하지 않는 함수란 호출자에게 제어권을 반환하지 않는 함수임을 의미한다. 즉, return을 하지 않고 프로그램이 바로 종료되거나, 후속 코드가 실행되지 않고 예외로 튀거나, 무한 루프에 들어가는 함수라는 뜻이다.

 

 

 

 

컴파일러에 리턴하지 않는 함수임을 알려주는 이유

컴파일러에게 아래에서 소개할 키워드 사용을 통해서 “이 함수는 절대 리턴하지 않는다”는 정보를 알려주면 다음과 같은 이점이 있다.

 

  • “리턴값이 없습니다" 또는 "모든 제어 경로에서 값을 반환하지는 않습니다” 같은 불필요한 컴파일러 경고를 억제할 수 있다. 단, 경고 발생 유/무는 컴파일러마다 다를 수 있다.
  • 컴파일러가 호출 이후 코드를 제거하거나 unreachable 코드로 처리하여 최적화할 수 있다.
  • 코드 경로 분석 시 명시적 키워드 사용을 통해 확실한 종료 경로로 인식할 수 있다.

 

 

 

리턴하지 않는 함수임을 명시하는 키워드

키워드에는 컴파일러 확장 기능에 속한 키워드와 언어 문법에 포함된 표준 키워드가 있으며, 가급적이면 표준 키워드를 사용하는 것이 좋다.

 

1. MSVC : __declspec(noreturn)

 

__declspec(noreturn)
void fatal_error(const char *msg) {
    fprintf(stderr, "Error: %s\n", msg);
    exit(1);
}

 

 

 

2. GCC/Clang : __attribute__((noreturn))

__attribute__((noreturn))
void fatal_error(const char *msg) {
    fprintf(stderr, "Error: %s\n", msg);
    exit(1);
}

 

 

 

 

3. C11 이상 : _Noreturn

_Noreturn void fatal_error(const char *msg) {
    fprintf(stderr, "Error: %s\n", msg);
    exit(1);
}

 

 

 

 

 

4. C++11 이상 : [[noreturn]]

[[noreturn]] void fatal_error(const char *msg) {
    throw std::runtime_error(msg);
}

 

 

 

 

 

 

테스트

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

bool error = true;

//__declspec(noreturn) void fatal_error(void)	// 경고 안뜸
//_Noreturn void fatal_error(void)	// 경고 안뜸
void fatal_error(void) // 경고 뜸, warning C4715: 'foo': 모든 제어 경로에서 값을 반환하지는 않습니다.
{
    printf("Fatal error!\n");
    exit(1);
}

int foo(void)
{
    if (error)
    {
        fatal_error();
    }
    else
    {
        return 0;
    }
}

int main(void)
{
    foo();
    return 0;
}

 

반응형