小编cur*_*mer的帖子

在C宏扩展期间,宏的特殊情况是否会扩展为"/*"?

这是一个相关的例子.它显然不是有效的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的编译器不应该只是在宏扩展期间插入额外的空格,因为它可能会阻止编程错误.

c macros c99 c-preprocessor

13
推荐指数
2
解决办法
889
查看次数

标签 统计

c ×1

c-preprocessor ×1

c99 ×1

macros ×1