【发布时间】:2017-08-09 18:24:12
【问题描述】:
我正在编写一个包含调试代码的程序,该代码可以通过宏 DEBUG 禁用。设置为1时,调试代码应该编译成二进制,设置为0时,调试代码不应该。
我在启用 -Wunreachable-code 的情况下进行编译,而我的问题来自编译如下代码:
if (DEBUG) {
printf("debug string!\n");
}
启用调试后,这将编译正常,因为条件将始终评估为 1 (true)。但是,当禁用调试 (DEBUG=0) 时,我在第二行的 printf 调用中收到无法访问的代码警告。我知道这可以通过#ifdef/#endif 预处理器指令来解决,但是如果可以避免的话,我不喜欢用预处理器指令填充我的程序主体。
我想知道是否有任何方法可以在不使用诊断编译指示 (#pragma GCC diagnostic) 的情况下将我的代码保留为 c 风格的条件。任何帮助将不胜感激,谢谢!
【问题讨论】:
-
除非您使用的是旧编译器,否则您不应该因为这样做而收到任何无法访问的警告(大约 3 年前,-Wunreachable-code 也已从 gcc 中删除,该标志只是被默默接受,但确实什么都没有)
-
您需要注意您的 clang 版本和您使用的编译器标志。至少某些 clang 版本(例如,Debian 伸展中的 clang 3.8)不会针对具有常量来自宏的常量条件的
if语句发出警告。 -
您是否考虑过放弃 if 语句并使用调试语句?见stackoverflow.com/questions/1941307/c-debug-print-macros