【发布时间】:2012-12-05 02:17:55
【问题描述】:
是否可以将 C 预处理器与变量名连接起来?
#define WIDTH 32
int dataWIDTH;
// dataWIDTH should be interpreted as 'data32'
printf("%d",dataWIDTH);
【问题讨论】:
标签: c variables concatenation c-preprocessor
是否可以将 C 预处理器与变量名连接起来?
#define WIDTH 32
int dataWIDTH;
// dataWIDTH should be interpreted as 'data32'
printf("%d",dataWIDTH);
【问题讨论】:
标签: c variables concatenation c-preprocessor
您的用例需要双重转义;单独使用标记粘贴 (##) 运算符只会附加预处理器指令的名称。
#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", data##32),这会产生编译器错误。我的理解是令牌粘贴仅适用于宏内部。