컴퓨터공부/C & C++ & STL

Cfaq 9

achivenKakao 2009. 4. 8. 14:45
Q 11.18
메시지 “warning: macro replacement within a string literal”은 무슨 뜻
이죠?
Answer : ANSI 이전의 어떤 컴파일러/전처리기는 매크로 정의를 다음과 같이 정
의할 경우:
#define TRACE(var, fmt) printf("TRACE: var = fmt\n", var)
다음과 같은 식으로 호출하게 되면:
CHAPTER 11. ANSI/ISO STANDARD C 193
TRACE(i, %d);
다음과 같이 확장하게 됩니다:
printf("TRACE: i = %d\n", i);
즉, 매크로 인자로 나온 이름이 문자열 안에 있는 경우라도 확장시켜 버립
니다. (물론 이러한 버그가 위와 같이 유용하게 쓰일 수도 있지만, 이 것은
대개 초창기 컴파일러를 만들 때 잘 못 만든 것입니다.)
이러한 식의 매크로 확장은 K&R에 언급된 것도 아니며, 표준 C 언어에서
언급된 것도 아닙니다. (매우 위험한 방법이며, 코드가 어려워집니다. 질문
10.22를 참고 바랍니다.) 매크로 인자 자체가 문자열이 되기를 원한다면 전
처리기 연산자인 #를 쓰거나, 문자열 연결 (concatenation) 기능을 쓰면 됩
니다 (이는 ANSI 표준의 새로운 기능입니다.):
#define TRACE(var, fmt) \
printf("TRACE: " #var " = " #fmt "\n", var)
질문 11.17을 참고하기 바랍니다.