헤더파일들이 함수정의와 같은 이름의 매크로 정의도 가지고 있는 경우가 많다.

가령, 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 해버림.