[C언어] 함수와 매크로가 동시에 정의되어 있을 때, 매크로를 undef 하지 않고 함수를 사용하는 방법
COM2008. 4. 10. 23:58 |헤더파일들이 함수정의와 같은 이름의 매크로 정의도 가지고 있는 경우가 많다.
가령, cype.h 에는 isalpha() 가 매크로로 뿐만 아니라 함수로도 정의가 되어있다.
isalpha() 의 함수버전을 쓰고 싶다면,
당연한 얘기지만, #undef 로 매크로를 취소해버리면 되기는 한다.
#undef isalpha
그러면, isalpha() 는 자동으로 함수가 되는데, 그럼 그 다음의 어딘가에서 macro version 을 코드에서 사용하는 것이 어려워진다.
이럴때, 괄호 ( ) 를 이용해서, 매크로를 undef 하지 않고도, 함수를 선택할 수 있다.
식별자를 ()로 감싸버리면, 매크로의 형태와 달라지기 때문에, 해당매크로로 인식을 하지 않고 따라서 치환하지 않는다. 반면, 함수의 경우, 식별자를 괄호로 감싸도 여전히 호출하므로 함수버전을 호출할 수 있게 된다.
가령, 위의 isalpha() 를 예로 들면, (isalpha)() 로 사용하는 것이다.
예.
#include<stdio.h>
void prn_int(int j){
printf("%d\n" , j );
}
#define prn_int(i) printf( #i " = %d\n" , i )
int main(int argc, const char * argv[]) {
int a=10;
(prn_int)(a);
prn_int(a);
return 0;
}
결과.
10
a=10
NOTE.
위 예제에서, #define 부분을 prn_int() 함수 정의 앞으로 옮기게 되면, error. 왜냐면, 함수 정의 부분에서 함수 이름을 replace 해버림.