식별자(Identifier)는 프로그래밍에서 변수나 함수 등 개체를 프로그램 내에서 구분하고 참조하기 위해 부여하는 이름입니다.
일반적으로 식별자는 프로그래머가 직접 만들지만, 언어 차원에서 기본 제공되는 사전 정의 식별자도 존재합니다. 대표적인 예로 cout, cin 등이 있습니다.
이 글에서는 C 프로그래밍 언어가 기본으로 제공하는 사전 정의 식별자 중 하나인 __func__에 대해 자세히 알아보겠습니다.
__func__의 공식 정의
C 표준에서 __func__는 다음과 같이 정의됩니다.
“식별자 __func__는 각 함수 정의의 여는 중괄호 바로 뒤에 아래 선언이 작성된 것처럼 컴파일러가 암묵적으로 선언해야 하며, 여기서 function-name은 해당 선언을 어휘적으로 감싸고 있는 함수의 이름이다.”
static const char __func__[] = "function-name";
쉽게 말해 __func__는 컴파일러가 자동으로 생성하는 식별자로, 함수 이름 문자열을 통해 현재 실행 중인 함수를 식별할 수 있게 해줍니다.
코드 예제를 통해 개념을 더 명확히 이해해 보겠습니다.
예제 1: 함수 이름 출력하기
#include <stdio.h>
void function1(void){
printf("%s\n", __func__);
}
void function2(void){
printf("%s\n", __func__);
function1();
}
int main(){
function2();
return 0;
}
출력 결과
function2
function1
설명: 위 예제에서는 __func__를 사용하여 호출된 함수의 이름을 출력했습니다. 이 식별자는 자신이 사용된 함수의 이름을 반환하므로, 두 개의 printf 문은 각각 자신이 속한 함수의 이름을 참조하여 출력합니다.
흥미롭게도 __func__는 main 함수에서도 동일하게 동작합니다.
예제 2: main 함수에서 사용하기
#include <stdio.h>
int main(){
printf("%s\n", __func__);
return 0;
}
출력 결과
main
다만 주의할 점이 있습니다. __func__는 재정의할 수 없습니다. 즉, __func__라는 이름은 오직 함수 이름 저장 용도로만 예약되어 있으므로, 다른 값을 저장하려고 하면 오류가 발생합니다.
예제 3: __func__ 재정의 시도
#include <stdio.h>
int __func__ = 123;
int main(){
printf("%s\n", __func__);
return 0;
}
출력 결과
error
유사한 사전 정의 식별자들
C 언어에는 __func__와 비슷한 역할을 하는 식별자들이 더 있습니다.
- __FILE__: 현재 소스 파일의 이름을 반환합니다.
- __LINE__: 현재 코드의 줄 번호를 반환합니다.
아래 예제로 실제 사용 방법을 확인해 보겠습니다.
예제 4: __func__, __LINE__, __FILE__ 함께 사용하기
#include <stdio.h>
void function1(){
printf("The function: %s is in line: %d of the file :%s\n", __func__, __LINE__, __FILE__);
}
int main(){
function1();
return 0;
}
출력 결과
The function: function1 is in line: 3 of the file :main.c
설명: __func__, __LINE__, __FILE__ 세 가지 식별자를 활용하면 현재 실행 중인 함수 이름, 코드가 위치한 줄 번호, 그리고 파일 이름 정보를 한 번에 얻을 수 있습니다. 이러한 정보는 로그 작성이나 디버깅 작업 시 매우 유용하게 활용됩니다.