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阶段:
宏调用被扩展
调试宏:
#define DEBUG(x) x
Run Code Online (Sandbox Code Playgroud)
哪个可以在生产中关闭:
#define DEBUG(x)
Run Code Online (Sandbox Code Playgroud)
或IIRC #undef(抱歉,我的C生锈了).
为什么不简单地使用eg
#ifdef DEBUG
a = b;
#endif /* DEBUG */
Run Code Online (Sandbox Code Playgroud)
减少麻烦,同样可读.
| 归档时间: |
|
| 查看次数: |
6505 次 |
| 最近记录: |