2012-12-17 30 views

回答

3

你的用例需要雙轉義;使用令牌粘貼(##)操作符本身只會附加預處理器指令的名稱。

#define WIDTH 32 

#define _MAKEDATA(n) data##n 
#define MAKEDATA(n) _MAKEDATA(n) 

int MAKEDATA(WIDTH) = 7; 
int _MAKEDATA(WIDTH) = 8; 

int main(int argc, char *argv[]) { 
    printf("%d\n", data32); 
    return 0; 
} 

產生

$ gcc -E foo.c 
int data32 = 7; 
int dataWIDTH = 8; 

int main(int argc, char *argv[]) { 
    printf("%d\n", data32); 
    return 0; 
} 
+0

此外,請參閱http://stackoverflow.com/questions/1489932/c-preprocessor-and-concatenation對雙重粘貼「技巧」的精彩討論, – user295691

1

有一個稱爲##令牌粘貼操作,讀到它,例如這裏:

http://msdn.microsoft.com/en-us/library/09dwwt6y(v=vs.80).aspx

+1

預處理器擴展這對'的printf( 「%d」,數據## 32)',這產生一個編譯錯誤。我的理解是,令牌粘貼只能在宏內運行。 – user295691

+0

該示例是由其他用戶添加的,所提供的鏈接顯示如何使用宏內的令牌粘貼。 –