이번 글에서는 PRINT(x)라는 매크로를 정의하는 방법을 알아보겠습니다. 이 매크로는 인자로 전달된 x의 값을 별도의 서식 지정 없이 그대로 화면에 출력하는 역할을 합니다.
이 문제를 해결하기 위해서는 전처리기가 제공하는 문자열화 연산자(stringize operator, #)를 활용해야 합니다. 매크로 매개변수 앞에 #을 붙이면 전달된 인자가 컴파일 이전 단계에서 자동으로 큰따옴표로 묶인 문자열 리터럴로 변환됩니다. 이렇게 변환된 문자열을 내부적으로 printf() 함수에 넘겨주면, 변수의 값이 아니라 코드에 작성한 인자 자체가 그대로 출력됩니다.
즉, PRINT(26)이라고 호출하면 #x는 "26"이라는 문자열이 되므로, 숫자든 텍스트든 부동소수점 값이든 어떤 형태의 인자든 모두 동일한 방식으로 출력할 수 있습니다. 다음 예제를 통해 더 자세히 살펴보겠습니다.
예제 코드
#include <stdio.h>
#define PRINT(x) printf(#x)
int main () {
PRINT(Hello);
printf("\n");
PRINT(26);
printf("\n");
PRINT(2.354721);
printf("\n");
}실행 결과
Hello 26 2.354721
위 실행 결과에서 확인할 수 있듯이, PRINT 매크로는 문자열(Hello), 정수(26), 실수(2.354721) 등 다양한 타입의 인자를 모두 문제없이 출력합니다. 이는 매크로 확장 단계에서 인자가 문자열로 치환되기 때문에, 일반적인 printf()처럼 %d나 %f 같은 서식 지정자를 미리 알 필요가 없기 때문입니다.
참고로 이 기법은 디버깅용 로그 메시지를 작성할 때 특히 유용하게 사용됩니다. 예를 들어 #define DEBUG_PRINT(x) printf(#x " = %d\n", x)와 같이 응용하면 변수의 이름과 값이 함께 출력되어 디버깅 효율을 크게 높일 수 있습니다.