如何创建"C单行注释"宏

ysa*_*sap 9 c macros gcc c-preprocessor

我试图在C中创建一个"单行注释"宏,根据一些全局宏定义,这有条件地用于注释掉代码行.这与本文中表达的观点相同.

尝试这段代码的许多排列,我不断收到编译器的错误消息.

例如,直接关注该页面的代码示例:

#define COMMENT SLASH(/)
#define SLASH(s) /##s
#define DEBUG_ONLY COMMENT
DEBUG_ONLY a = b;   // <-- line #83
Run Code Online (Sandbox Code Playgroud)

GCC给出以下错误:

prog.c:83:1:错误:粘贴"/"和"/"没有给出有效的预处理标记
prog.c:83:错误:'/'标记之前的预期表达式

如上所述,我玩过这个主题并尝试了很多变化,但都没有给出类似的诊断.

我做错了什么,为什么文章中的代码编写得不好?

Ste*_*sop 18

它不起作用,因为语言规范不允许它.实际上,宏替换之前发生了注释删除.删除注释后,//不是有效的令牌(如错误消息所示).它不能通过宏替换生成,它不再意味着"评论".

这是标准中的"翻译阶段".章节编号有所不同,但C89,C99和C11都在第3阶段定义:

每个注释都被一个空格字符替换.

然后在第4阶段:

宏调用被扩展


dje*_*lin 9

调试宏:

#define DEBUG(x) x
Run Code Online (Sandbox Code Playgroud)

哪个可以在生产中关闭:

#define DEBUG(x)
Run Code Online (Sandbox Code Playgroud)

或IIRC #undef(抱歉,我的C生锈了).

  • @ysap,只需要`#define d(x)if((x> 0)&& 0)`,任何(中途)智能编译器都会摆脱整个`d(某事){...}`结构. (2认同)

Som*_*ude 7

为什么不简单地使用eg

#ifdef DEBUG
a = b;
#endif  /* DEBUG */
Run Code Online (Sandbox Code Playgroud)

减少麻烦,同样可读.

  • 当它出现在几个地方时,你可能是对的.当它出现在许多模块中的数十个地方时,具有较深的嵌套级别,这肯定会使您的代码无法读取. (3认同)
  • @ysap代码不会进化,它会腐烂.扔出去重新开始.如果您的管理层认为发展原型可以让他们达到更具攻击性的目标,那么就找到新的管理层,因为它们是错误的. (2认同)