C 언어 | 전처리(preprocess) | 문자열화
매크로 함수에 전달된 코드를 문자열 화하는 방법을 소개한다. 이것으로 문자열이 아닌 텍스트를 매크로에 주어 이를 전개할 때에 문자열로 변환할 수 있다.
매크로 함수와 문자열화 연산자
#define으로 작성된 매크로 함수에만 지정할 수 있는 처리기 연산자에 매개 변수로 받은 토큰 열을 문자열로 변환하는 연산자가 있다. 이것은 주어진 토큰 열을 분석하고 따옴표를 부가한 형태로 전개한다. 이렇게 하면 숫자와 토큰 열을 자동으로 문자열 화하는 매크로 함수를 만들 수 있을 것이다.
토큰 열을 문자열 화하려면 매크로 함수의 파라미터 앞에 # 연산자를 지정한다. 예를 들어, 다음과 같이 작성하면 함수는 주어진 인수를 문자열 화한다.
#define TOSTRING(param) #param
이것은 매크로 함수이므로 param에 전달되는 토큰 열의 형태를 규제할 수 없다. 그러나 param의 토큰 열이 어떤 것이 든 # 연산자는 토큰 열을 문자열 화한다. 그 관계는 다음과 같은 것이 될 것이다.
TOSTRING(1234) → "1234"
TOSTRING(int iValue = 10\n) → "int iValue = 10\\n"
TOSTRING("Kitty") → "\"Kitty\""
이러한 변환은 컴파일 전에 소스 텍스트 레벨에서 전개되는 것에 유의한다. 프로그램 실행시에 동적으로 변환되는 것은 아니다. 문자열 화 연산자는 토큰 열의 따옴표(")은 "으로 변환하고 슬래시()는 \로 변환된다. 이렇게 함으로써 토큰 열을 확실하게 그대로의 형태로 문자열화 할 수 있다.
코드1
#include <stdio.h>
#define PRINTLN(string) printf(#string "\n")
int main() {
PRINTLN(0xFF);
PRINTLN(Kitty on your lap);
PRINTLN(Kernighan and Ritchie wrote "hello, world\n" on their book.);
return 0;
}
코드1의 PRINTLN() 매크로 함수는 인수로 지정한 토큰 열을 문자열로 printf()로 표시한다. 처음 두개는 그대로 문자열화되어 있는 것을 확인할 수 있다. 재미있는 것은 마지막 장문으로 "hello, world\n"
이라는 토큰이 문자열 화되어 있는 곳이다. 이러한 문자열은 전처리에 의해 \"hello, world\\n\"
로 변환된다. 따라서 따옴표나 이스케이프 문자가 그대로 표시된다.