由于条件宏,Clang / GCC禁用未使用的代码警告

时间:2017-08-09 18:24:13

标签: c gcc

我正在编写一个程序,其中包含可以通过宏DEBUG禁用的调试代码。设置为1时,调试代码应编译为二进制文件,设置为0时,调试代码不应为。{/ p>

我正在使用-Wunreachable-code进行编译,而我的问题来自编译代码,例如:

if (DEBUG) {
    printf("debug string!\n");
}

启用调试时,这将编译正常,因为条件将始终评估为1(true)。但是,当禁用调试(DEBUG=0)时,我会在第二行的printf调用上收到无法访问的代码警告。我知道这可以通过#ifdef/#endif预处理程序指令来解决,但是如果可以避免的话,我不喜欢用预处理程序指令填充程序体。

我想知道是否有任何方法可以在不使用诊断编译指示(#pragma GCC diagnostic)的情况下将代码保留为c样式条件。任何帮助将不胜感激,谢谢!

2 个答案:

答案 0 :(得分:3)

您可以使用pre-proccessor条件而不是运行时条件:

#if DEBUG == 1
  printf("debug string!\n");
#endif

因此,完整的调试代码被消除了#34;没有离开"空"代码块。这比让任何调试代码更加清晰,这些调试代码在生产环境中可能会有不同的行为并影响其余的代码。

或者,如果由于某种原因您不能使用预处理器条件,则可以引入log - 或trace - 函数,通常在单独的翻译单元中。然后你可以对其中的DEBUEG做出反应。你甚至可以提供两个库实现,一个"空"一个用于生产和一个"工作"一个用于deubug,并配置您的构建以选择正确的实现。

但是 - 如上所述 - 即使是一个"空的"函数可能会影响编译时优化或运行时行为。所以我真的建议采用预处理器的方式。

答案 1 :(得分:0)

我只是在clang上发出警告(如果-Wunreachable-code打开),而不是gcc。 开关使警告静音。或者,pragma也会这样做(如果你只是反对pragma指令,你可以使用_Pragma关键字。)

#include <stdio.h>
#define DEBUG 0
int main()
{
#if 1
    switch(!!DEBUG){
    case 1: puts("hello world");
    case 0:;
    }
#else
    _Pragma("gcc diagnostic push(\"-Wno-unreachable_code\")")
    if(DEBUG){
        puts("hello world");
    }
    _Pragma("gcc diagnostic pop")
#endif

}