C 언어 | 전처리(preprocess) | 토큰 연결 ##


임의의 토큰을 결합하는 ## 연산자를 설명한다. 주로 매크로 함수에 전달된 매개 변수를 다른 매크로나 값과 결합하기 위해 사용된다.

토큰 연결 연산자

#define을 이용한 매크로 전용 처리기 연산자로 문자열화 연산자 외에도 또 하나 중요한 연산자가 존재한다. 그것은 두 개의 샵 기호로 구성된 ## 연산자로 토큰 연결 연산자라고도 한다. 이 연산자는 일반 매크로와 함수형 매크로로 사용할 수 있다.

## 연산자

토큰1 ## 토큰2

토큰 연결 연산자는 좌변의 토큰과 우변의 토큰을 접합한다. 토큰의 접합은 단순히 C 언어의 소스 레벨의 텍스트를 전처리에 의해 연결시키는 것이고, 프로그램이 동적으로 접합시키는 것은 아니라는 점에 유의하한다. 예를 들어, 매크로으로 WIN ## 32을 지정하면 WIN32이라는 토큰에 연결되고, WIN ## 16이라면 WIN16이 된다. 매크로 함수의 인수와 토큰 연결 연산자를 사용하면, 매크로를 사용하여 토큰의 지정을 감출 수 있다.

#define INT16 short
#define INT32 int
#define INT(n) INT ## n

위의 INT() 매크로 함수는 INT는 토큰과 n 매개 변수를 연결한다. 예를 들어 INT(16)라고 지정한 경우 INT16에 전개되고, 덧붙여서 INT16 매크로가 처리되어 최종적으로는 short로 확장된다.

코드

#include <stdio.h>
#define TOKEN0 "Kitty"
#define TOKEN1 "Kitten"
#define TOKEN(n) TOKEN ## n

int main() {
  printf("%s\n" , TOKEN(0));
 printf("%s\n" , TOKEN(1));
 return 0;
}

코드1의 TOKEN() 매크로 함수는 인수에 연결하는 토큰을 받는다. 프로그램의 사양에서 인수로 지정할 수 있는 값은 0 또는 1 중 하나이다. 예를 들어 TOKEN(0)을 지정했을 경우, 이것은 TOKEN ## 0으로 해석되며, 이러한 토큰을 결합하여 궁극적으로 TOKEN0으로 전개된다. TOKEN0라는 #define으로 정의된 이름이므로 문제 없다.

이와 같이, 토큰 연결 연산자를 사용하여 결합된 새로운 토큰은 반드시 유효한 토큰이 아니면 안된다. 잘못된 토큰이라면 당연히 컴파일 시에 에러가 발생한다. 토큰의 연결은 전처리 컴파일 전에 처리하는 소스 레벨의 전개에 불과한 것을 잊지 말도록 하자.