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

标签 c gcc

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

我在编译时启用了 -Wunreachable-code,我的问题来自编译这样的代码:

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

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

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

最佳答案

您可以使用预处理器条件而不是运行时条件:

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

因此,完整的调试代码被“消除”而不留下“空”代码块。这比让任何调试代码在生产环境中在变化的条件下可能表现不同并影响其余代码要干净得多。

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

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

关于由于条件宏,Clang/GCC 禁用未使用的代码警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45598080/

相关文章:

c - 如何创建在多个接口(interface)上发送/接收 UDP 广播的服务

c++ - C/C++/ObjectiveC 之间的内存差异,程序在 codepad.org 上崩溃,但在 Linux 上不会

c++ - 为什么 __builtin_parity 是相反的?

c++ - GCC 下的 2 字节 (UCS-2) 宽字符串

c++ - 我怎样才能让 gcc 警告我 "int i = i;"

c# - 有没有用 C# 将 Java 库编译成可包装的东西的例子?

c - 使用指针替换值

c - 结构体元素删除自身

c - 如何使用 GCC 获取与程序集输出内联的源代码行?

gcc - libTogl undefined reference