【发布时间】:2010-11-12 13:50:52
【问题描述】:
这是一个相关的例子。这显然是无效的C,但我这里只是处理预处理器,所以代码实际上不必编译。
#define IDENTITY(x) x
#define PREPEND_ASTERISK(x) *x
#define PREPEND_SLASH(x) /x
IDENTITY(literal)
PREPEND_ASTERISK(literal)
PREPEND_SLASH(literal)
IDENTITY(*pointer)
PREPEND_ASTERISK(*pointer)
PREPEND_SLASH(*pointer)
在上面运行 gcc 的预处理器:
gcc -std=c99 -E macrotest.c
这会产生:
(...)
literal
*literal
/literal
*pointer
**pointer
/ *pointer
请注意最后一行的多余空格。
对我来说,这看起来像是一个防止宏扩展为“/*”的功能,我敢肯定这是出于好意。但乍一看,我在 C99 标准中找不到与此行为有关的任何内容。再说一次,我对 C 缺乏经验。有人可以对此有所了解吗?这是在哪里指定的?我猜想遵循 C99 的编译器不应该仅仅因为它可能会防止编程错误而在宏扩展期间插入额外的空格。
【问题讨论】:
标签: c macros c-preprocessor c99