#define을 사용한 매크로 치환의 문법은 아래와 같습니다.

#define name replacement text

토큰 name은 replacement text로 치환(교체,replacement)됩니다.
replacement text는 라인의 끝까지 기술할 수 있고, 너무 길다면 백슬래시 문자(\)를 끝에 표시하여
개행 한후 계속 표시할 수 있습니다. name으로 치환된 문장은 컴파일이 되면서
정의가 시작되는 시점에서 소스파일의 긑까지 영향을 줍니다.

#define으로 매크로를 정의하는 예제를 여러가지 들어 보도록 하겠습니다.

#define forever for (;;)

위의 정의문은 forever라는 name으로 무한루프를 정의합니다. forever는 for(;;)로 치환되어
무한루프와 같은 문장이 됩니다.

또한 아래와 같이 매개인수(arguments)들을 정의하는 것도 가능합니다.

#define max(A, B) ((A) > (B) ? (A) : (B))

함수호출처럼 보일지 모르나, max는 인라인 코드로 됩니다. 예를들면,

x = max(p+q, r+s);

위의 문장은

x = ((p+q) > (r+s) ? (p+q) : (r+s));

으로 치환(교체)됩니다.
그러나 이것을 사용할때 몇가지 함정에 빠지지 않도록 주의 합니다.

max(i++, j++) /* 잘못된 사용 */

증가연산이 두번 이루어집니다.

#define square(x) x * x /* 잘못된 정의 */

square(z+1) 으로 진환됩니다.

위와 같이 몇가지 사항을 주의하면, 매크로는 아주 유용합니다.
에 있는 코드들을 보면, getchar 와 putchar 는 매크로로 정의되어 있어서
실행(run-rime)시 함수호츨의 부하(overhead)를 피할 수 있습니다.

매크로를 정의할때 문자열을 매개인수로 넘겨야 하는 경우가 있습니다.
이때 매개인수에 #문자를 넣으면 됩니다. 예를들면,

#define dprint(expr) printf(#expr " = %g\n", expr)

이렇게 매크로를 정의하고,

dprint(x/y);

를 호출하면, 아래와 같이 치환됩니다.

printf("x/y" " = &g\n", x/y);

문자열이 합쳐져서 결국 다음과 같이 됩니다.

printf("x/y = &g\n", x/y);

전처리기 연산자 ##은 매크로가 확장(치환)될때 매개인자들을 합치는데 사용합니다.
예를들면,

#define paste(front, back) front ## back

이렇게 정의하면,

paste(name, 1) 는 name1 토큰을 생성합니다.

출처 : http://kldp.org/node/109823 by 알지비

+ Recent posts