Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C 언어의 함수 지정자(Function Specifier)란? _Noreturn과 inline 완벽 정리

C와 C++에는 함수의 특성(property)을 컴파일러에게 알려주는 함수 지정자(function specifier)가 존재합니다. 함수 지정자를 활용하면 컴파일러가 코드를 최적화하거나, 함수의 동작 방식에 대한 중요한 단서를 얻을 수 있습니다.

주요 함수 지정자의 종류

C++에서는 대표적으로 inline 함수 지정자를 사용합니다. 이는 컴파일러에게 함수 호출 오버헤드를 줄이기 위해 함수 본문을 호출 지점에 직접 삽입하도록 힌트를 주는 역할을 합니다.

반면 C 언어(C11 표준부터)에는 _Noreturn 함수 지정자가 도입되었습니다. 이 지정자는 해당 함수가 호출한 곳으로 제어권을 반환하지 않는다는 것, 즉 아무 값도 돌려주지 않고 종료된다는 의미를 나타냅니다.

일반적인 함수 예제

먼저 일반적인 함수의 동작을 살펴보겠습니다. 아래 코드는 두 정수를 더해 결과를 반환하는 평범한 함수입니다.

#include<stdio.h>
int myAdd(int a, int b){
   return a + b;
}
main() {
   int x = 10, y = 20;
   printf("The value is: %d\n", myAdd(x, y));
}

출력 결과

The value is: 30

_Noreturn 지정자 사용 시 주의점

그런데 만약 값을 반환하는 함수에 _Noreturn을 잘못 적용하면 어떻게 될까요? 이 경우 컴파일러는 선언과 실제 동작이 일치하지 않는다는 사실을 감지하고 경고(warning)를 출력하며, 프로그램은 오류와 함께 비정상적으로 종료될 수 있습니다.

예제

#include<stdio.h>
_Noreturn int myAdd(int a, int b){
   return a + b;
}
main() {
   int x = 10, y = 20;
   printf("The value is: %d\n", myAdd(x, y));
}

출력 결과

[Warning] function declared 'noreturn' has a 'return' statement
[Warning] 'noreturn' function does return

추가로 알아두면 좋은 정보

_Noreturn은 exit(), abort()처럼 절대 호출자에게 돌아오지 않는 함수에 적합합니다. 또한 <stdnoreturn.h> 헤더를 포함하면 noreturn이라는 매크로를 사용할 수 있어 코드 가독성을 높일 수 있습니다. 반대로 무한 루프를 도는 함수나 항상 프로그램을 강제 종료하는 함수가 아니라면 _Noreturn을 남용하지 않는 것이 좋습니다.