这是一个相关的例子.它显然不是有效的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)
Run Code Online (Sandbox Code Playgroud)
在其上运行gcc的预处理器:
gcc -std=c99 -E macrotest.c
Run Code Online (Sandbox Code Playgroud)
这会产生:
(...)
literal
*literal
/literal
*pointer
**pointer
/ *pointer
Run Code Online (Sandbox Code Playgroud)
请注意最后一行的额外空间.
这看起来像一个功能,以防止宏扩展到"/*"给我,我敢肯定是善意的.但是一目了然,我在C99标准中找不到任何与此行为有关的内容.然后,我对C缺乏经验.有人可以对此有所了解吗?这指定在哪里?我猜想一个坚持C99的编译器不应该只是在宏扩展期间插入额外的空格,因为它可能会阻止编程错误.