Gcc预处理器和粘贴

Gcc preprocessor and pasting

本文关键字:处理器 预处理 Gcc      更新时间:2023-10-16

前几天我在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);

用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似乎做得很好。

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

gcc -Ulinux

或符合标准:

gcc -std=c90 -pedantic ... # or -std=c89 or -ansi
gcc -std=c99 -pedantic
gcc -std=c11 -pedantic

在这里查看更多关于为什么的讨论:为什么C预处理器解释单词";linux";作为常数";1〃;?