【问题标题】:Cleaning up C/C++ code reveals problems with variadic macros清理 C/C++ 代码揭示了可变参数宏的问题
【发布时间】:2023-12-05 18:33:01
【问题描述】:

我们正在对 C、C++ 和 Java 的代码库进行一些代码清理、修复有符号/无符号比较、运行静态分析等。

我们收到的警告之一是

warning: ISO C does not permit named variadic macros

及其伴随的警告

warning: ISO C99 requires rest arguments to be used

现在,在 C 代码中,我使用 C99 standard variadic macro 来解决问题,但在 C++ 代码中,正确答案是什么?使用相同的 C99 样式会导致不同的警告

warning: anonymous variadic macros were introduced in C99 

我没有看到任何答案。

我们在 Linux 中使用 GCC (G++) 4.4.3。

我希望有一些标志或其他方法可以纠正或禁用特定代码部分 - 但它用于几乎每个文件中使用的日志记录...

【问题讨论】:

  • 使用 C++11。在 GCC 命令行上输入 -std=c++0x-std=c++11。或者只是忽略警告。
  • 是的,还没有使用 c++11,只是支持不够好(还)
  • 所以你基本上是在说@Bo-Persson 没有办法消除警告(除了关闭它们),因为可变参数宏在 C++ 11 之前不是标准的 C++ 吗?跨度>
  • @Petri - 我现在没有任何其他方式。 gcc 4.4.3 可能不知道 C++ 的最新变化。

标签: c++ c macros c99 variadic-macros


【解决方案1】:

使用 gcc 选项 -Wno-variadic-macros 禁用该特定警告。

编辑:(来自 cmets)

要禁用一段代码的警告,但通常保持开启状态,请使用#pragma GCC diagnostic described here

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wvariadic-macros"

    // Your code and/or include files
    // (No variadic warnings here)

#pragma GCC diagnostic pop

【讨论】:

  • 有没有办法禁用一段代码的警告但一般保持开启?如果我使用它,我该如何禁用warning: ISO C99 requires rest arguments to be used
  • 谢谢@Hasturkun 我会试试的
  • 编译指示在臭气熏天的旧 gcc-4.2.3 中对我不起作用,但 -Wno-variadic-macros 完成了这项工作,因此被投票赞成。
  • That pragma 对我也不起作用,但我通过 #pragma GCC diagnostic ignored "-Wvariadic-macros" 得到了它(没有 no-
最近更新 更多