关于c ++:Gcc预处理器和粘贴

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"?