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

问题描述 投票:3回答:2

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

我正在编译-Wunreachable-code enabled,我的问题来自编译代码,例如:

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

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

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

c gcc
2个回答
3
投票

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

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

因此,完整的调试代码被“消除”而不留下“空”代码块。这比让生产中的任何调试代码更加清晰,这些调试代码在更改的条件下可能会表现不同并影响其余代码。

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

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


0
投票

我只是在clang上发出警告(如果-Wunreachable-code打开),而不是gcc。开关使警告静音。或者,编译指示也可以(如果您只反对编译指示,则可以使用_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

}
© www.soinside.com 2019 - 2024. All rights reserved.