我只有定义DEBUG的地方才需要记录一些代码。因此,尽管我可以用注释字符串“ //”替换令牌(此处为“ DEBUGLOG”)。但是怎么办?
#ifndef DEBUG
#define DEBUGLOG //
#endif
[...]
DEBUGLOG printf("Debug String"\n);
[...]
代码中没有其他地方的DEBUG定义。但是我的gcc编译了这一行,程序本身执行了printf();
为什么?
我试图将其包含在这样的括号中,但是它得到了编译错误:
#ifndef DEBUG
#define DEBUGLOG "//"
#endif
这是编译器消息:
beispiel.c:45:10: error: expected ‘;’ before ‘printf’
DEBUGLOG printf("Debug String"\n);
^
有任何提示吗?
答案 0 :(得分:3)
如果您查看Phases of translation,则会发现执行预处理器的阶段(阶段4)是在之后,在该阶段之后,注释被替换为空白字符(阶段) 3)。
第3阶段
1)将源文件分解为注释,空白字符序列(空格,水平制表符,换行符,垂直制表符和换页符)以及预处理标记,这些标记如下:
...
2)每个注释都用一个空格字符代替第四阶段
1)预处理器已执行。
因此,在第3阶段中,该行为:
#define DEBUGLOG //
成为:
#define DEBUGLOG
第4阶段的行:
DEBUGLOG printf("Debug String"\n);
成为:
printf("Debug String"\n);
这就是执行您的printf
的原因。
当您使用引号("//"
)时,该行变为:
"//" printf("Debug String"\n);
引号(""
)将不会被删除。这是编译器错误。