일하면서 신가하게 본 cpp 코드에 대해서 정리해보려고 한다.
오늘 처음 본 것은 아닌데, Token pasting operator라는 이전엔 듣도 보도 못한 operator가 있더라.
token passing operator란
MS docs에 정의된 내용을 보면, 전처리 연산자로 @define과 함께 사용되는 operator이다1. 토큰을 다른데 붙여서 사용한다는건데, 예제를 보지 않으면 선뜻 이해하기 어려운 개념이다.
실제 처음 코드를 봤을 땐, 이런 문법이 있나 싶더라..
기본 예제
#include <stdio.h>
#define token(base, postfix) base##postfix
int main(void) {
int testval = 5000;
printf("%d", token(test, val));
return 0;
}
가장 기본적인 예제는 위와 같다. base에 postfix를 붙여주는 방식으로 token passing operator가 사용된다.
이런 코드는 응용해서 사용하면 이해하기 불편할 수 있지만 새로운 사용성을 제시한다.
응용 예제
#define TO_VALID(name) { \
name##_valid = true; \
}
#define PUT_IF_VALID(name, value) { \
if(name##_valid) { \
name = value; \
} \
}
int test;
int game;
bool test_valid = false;
bool game_valid = false;
TO_VALID(test);
PUT_IF_VALID(test, 5000);
PUT_IF_VALID(game, 5000);
위와 같이 define을 함수화시켜서 서로 다른 여러 개의 name에 대해 접근할 수 있다.
주의 사항
define
의 option처럼 사용되는 것으로, 일반문에서 사용할 수 없다.- 기본적으로 사용되는 변수들은 이미 정의되어 있어야 한다.
- 아래와 같은 코드도 사용가능하지만, 추천하지 않는다.
#define VAL_NAME(base, postfix) base##postfix int token(test, val) = 3; printf("%d", testval);
-
여기에 나온
#
,#@
operator들은 개념이 정말 쉬운데, 내 리눅스 pc에서는 빌드되지 않더라..(왜지?) 사실 그닥 사용성이 애매한 operator들일 것 같아(실제로 의미있게 쓰이는데가 있는지도 잘 모르겠다) 이번 포스팅에 정리하지 않는다. ↩