Gcc预处理器和粘贴

KJH*_*KJH 6 c c++ gcc

我前几天在stackoverflow上找到了这个片段(谢谢你):

#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);
Run Code Online (Sandbox Code Playgroud)

用gcc -E编译,结果如下:

# 1 "xx.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "xx.c"





extern void somefunc_3(char *x);
Run Code Online (Sandbox Code Playgroud)

然而:

#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);
Run Code Online (Sandbox Code Playgroud)

结果是:

# 1 "xx.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "xx.c"





extern void somefunc_1(char *x);
Run Code Online (Sandbox Code Playgroud)

我该怎么做才能让它返回'somefunc_linux'?克朗似乎做对了,顺便说一句.

小智 5

如果要使用linux作为名称,可以更改编译器选项以取消定义:

gcc -Ulinux
Run Code Online (Sandbox Code Playgroud)

或符合标准:

gcc -std=c90 -pedantic ... # or -std=c89 or -ansi
gcc -std=c99 -pedantic
gcc -std=c11 -pedantic
Run Code Online (Sandbox Code Playgroud)

请参阅有关原因的更多讨论:为什么C预处理器将单词"linux"解释为常量"1"?