我前几天在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"?