2014-04-28 43 views
6

我发现计算器有一天这个片段(感谢那个):gcc的预处理器和粘贴

#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 "xx.c" 
# 1 "<built-in>" 
# 1 "<command-line>" 
# 1 "xx.c" 





extern void somefunc_3(char *x); 

但是:

#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 "xx.c" 
# 1 "<built-in>" 
# 1 "<command-line>" 
# 1 "xx.c" 





extern void somefunc_1(char *x); 

我能做些什么来使这个返回'somefunc_linux'?顺便说一句,Clang似乎是对的。

+3

还声明您的编译器版本。我用clang和gcc得到了相同的结果 - 因为这两种编译器都预先定义了一个'#define linux 1' – nos

+0

啊..很好的调用。我没有检查是否预定义了linux。 – KJH

+0

我认为在Linux上,它只是'linux',在两端都有两个下划线。我的错。 – KJH

回答

相关问题