是否可以連接一ç預處理用一個變量名?
#define WIDTH 32
int dataWIDTH;
// dataWIDTH should be interpreted as 'data32'
printf("%d",dataWIDTH);
是否可以連接一ç預處理用一個變量名?
#define WIDTH 32
int dataWIDTH;
// dataWIDTH should be interpreted as 'data32'
printf("%d",dataWIDTH);
你的用例需要雙轉義;使用令牌粘貼(##)操作符本身只會附加預處理器指令的名稱。
#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;
}
有一個稱爲##令牌粘貼操作,讀到它,例如這裏:
http://msdn.microsoft.com/en-us/library/09dwwt6y(v=vs.80).aspx
預處理器擴展這對'的printf( 「%d」,數據## 32)',這產生一個編譯錯誤。我的理解是,令牌粘貼只能在宏內運行。 – user295691
該示例是由其他用戶添加的,所提供的鏈接顯示如何使用宏內的令牌粘貼。 –
此外,請參閱http://stackoverflow.com/questions/1489932/c-preprocessor-and-concatenation對雙重粘貼「技巧」的精彩討論, – user295691