在传统模式中间接引用宏

时间:2013-08-13 21:06:09

标签: preprocessor gfortran c-preprocessor

如果我使用标准预处理,那么我可以通过以下方式执行间接引用:

#define foo bar
#define quoteme_(x) #x
#define quoteme(x) quoteme_(x)

然后只需使用quoteme(foo)获取"bar"

我想这样做,但在传统模式下使用预处理器。我试图将#x替换为'x',但quoteme(foo)只返回'foo'

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

使用GCC附带的cpp(已测试4.8.1)和代码(example.c):

#define foo bar
#define quoteme_(x) "x"
#define quoteme(x) quoteme_(x)

quoteme(foo)

cpp -traditional example.c输出的相关部分是:

"foo"

(您可以在替换quoteme_(x)时使用单引号,类似于获取'foo')。这就是你在问题中观察到的。

AFAIK,没有办法让'bar'"bar"退出传统的预处理系统。预标准(传统)系统没有标准化,并且有不同系统表现不同的细节。然而,宏观论点在替换之后被扩展,而不是像之前的C89及之后那样,这导致了你所看到的结果。