2017-12-12 10 views
1

다음 코드 고려 : 나는 val0xAA에 확장 매크로 VAL(TOTO) 싶습니다토큰을 붙여 넣기 전에 매크로를 확장 할 수 있습니까?

#define TOTO 0xAA 
#define TITI 0xBB 

unsigned char val0xAA[] = {1, 2, 3}; 
unsigned char val0xBB[] = {4, 5, 6}; 

// Macro using Token pasting 
#define VAL(_x_) val##_x_ 

void foo(void) 
{ 
    // Silly attempt to abuse preprocessor 
    unsigned char *tab1 = VAL(TOTO); 
    unsigned char *tab2 = VAL(TITI); 
} 

을하지만 실제로 valTOTO로 확장하고 컴파일이 실패합니다.

질문 : 토큰 붙여 넣기 평가 전에 TOTO의 평가를 "강제/우선 순위 지정"할 수 있습니까?

답변

3

예, 일반적인 트릭입니다. 다른 레이어를 추가하기 만하면됩니다.

#define TOTO 0xAA 
#define TITI 0xBB 

unsigned char val0xAA[] = {1, 2, 3}; 
unsigned char val0xBB[] = {4, 5, 6}; 

// Macro using Token pasting 
#define VAL1(_x_) val##_x_ 
#define VAL(_x_) VAL1(_x_) // expand and pass to VAL1 to concatenate 

void foo(void) 
{ 
    // Silly attempt to abuse preprocessor 
    unsigned char *tab1 = VAL(TOTO); 
    unsigned char *tab2 = VAL(TITI); 
} 
+0

오, 멋지다. 나는 그것에 대해 생각하지 않았다. :) – Coconop