Gcc preprocessor and pasting
我前几天在stackoverflow上找到了这个片段(谢谢你):
1 2 3 4 5 6 | #define PLATFORM 3 #define PASTER(x,y) x ## _ ## y #define EVALUATOR(x,y) PASTER(x,y) #define PLATFORMSPECIFIC(fun) EVALUATOR(fun, PLATFORM) extern void PLATFORMSPECIFIC(somefunc)(char *x); |
用gcc -E编译,结果如下:
1 2 3 4 5 6 7 8 9 10 | # 1"xx.c" # 1"<built-in>" # 1"<command-line>" # 1"xx.c" extern void somefunc_3(char *x); |
然而:
1 2 3 4 5 6 | #define PLATFORM linux #define PASTER(x,y) x ## _ ## y #define EVALUATOR(x,y) PASTER(x,y) #define PLATFORMSPECIFIC(fun) EVALUATOR(fun, PLATFORM) extern void PLATFORMSPECIFIC(somefunc)(char *x); |
结果是:
1 2 3 4 5 6 7 8 9 10 | # 1"xx.c" # 1"<built-in>" # 1"<command-line>" # 1"xx.c" extern void somefunc_1(char *x); |
我该怎么做才能让它返回'somefunc_linux'? 克朗似乎做对了,顺便说一句。
如果要使用linux作为名称,可以更改编译器选项以取消定义:
1 | gcc -Ulinux |
或符合标准:
1 2 3 | gcc -std=c90 -pedantic ... # or -std=c89 or -ansi gcc -std=c99 -pedantic gcc -std=c11 -pedantic |
请参阅有关原因的更多讨论:为什么C预处理器将单词"linux"解释为常量"1"?