如果我使用标准预处理,那么我可以通过以下方式执行间接引用:
#define foo bar
#define quoteme_(x) #x
#define quoteme(x) quoteme_(x)
然后就quoteme(foo)
用来获取"bar"
我想这样做,但在传统模式下使用预处理器。我试图只替换#x
为'x'
但quoteme(foo)
只是返回'foo'
。
任何帮助深表感谢。
如果我使用标准预处理,那么我可以通过以下方式执行间接引用:
#define foo bar
#define quoteme_(x) #x
#define quoteme(x) quoteme_(x)
然后就quoteme(foo)
用来获取"bar"
我想这样做,但在传统模式下使用预处理器。我试图只替换#x
为'x'
但quoteme(foo)
只是返回'foo'
。
任何帮助深表感谢。
使用cpp
GCC 附带的(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 和更高版本之前,这就是导致您看到的结果的原因。