【问题标题】:How to suppress GCC variadic macro argument warning for zero arguments for a particular macro definition within a source file [duplicate]如何抑制源文件中特定宏定义的零参数的GCC可变参数宏参数警告[重复]
【发布时间】:2016-06-05 20:33:27
【问题描述】:

我想抑制零参数的 GCC 可变参数宏参数警告,例如:

// for illustration purposes only:
int foo(int i) { return 0; };
#define FOO(A, ...) foo(A, ##__VA_ARGS__)
FOO(1);
     ^  warning: ISO C++11 requires at least one argument for the "..." in a variadic macro

使用 GCC 5.3.0 时源文件中的特定宏定义。

在 clang 中是这样完成的:

// ... large file
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wgnu-zero-variadic-macro-arguments"
#define FOO(A, ...) foo(A, ##__VA_ARGS__)
#pragma clang diagnostic pop
// ... large file

// not necessary on the same file
FOO(1);  // doesnt trigger the warning

在 gcc 中,-pedantic 似乎是一种神奇的警告类型,因此以下内容不起作用:

// ... large file
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wpedantic"
#define FOO(A, ...) foo(A, ##__VA_ARGS__)
#pragma GCC diagnostic pop
// ... large file

为了清楚起见,警告应该在整个程序中启用,除了这个特定的 sn-p 代码。这是关于细粒度的控制。只需不将 -pedantic 传递给编译器,即可在 GCC 中为整个程序禁用警告。

【问题讨论】:

  • @Zulan 该问题要求提供启用禁用此警告的警告标志的名称。这个问题询问如何在源文件的宏定义中准确地使用该警告标志来禁用此警告(您的答案更适合这里)。
  • 我建议只编辑原始问题以澄清您的意图。
  • 我可以这样做,但基本上对我来说已经没有多大意义了(感觉像改变问题太多了)。对于有兴趣为整个程序打开警告的人来说,只知道标志就足够了。这个有点……更多关于细粒度控制,因为-Wpedantic 看起来比 GCC 中的其他警告更神奇(但不是 clang)。
  • 我同意你的论点并将我的答案移到这里。
  • 本案例的替代解决方案是#define FOO(...) foo(__VA_ARGS__)

标签: c++ gcc macros


【解决方案1】:

你应该能够使用

来抑制它

#pragma GCC system_header

但这适用于文件的其余部分,您不能只在包含的文件中使用它。所以不能提供完美的范围界定,可能需要重新洗牌/间接包含头文件。

(但坦率地说,如果您不能修复头文件符合标准,您不妨将整个头文件视为 system_header,这会将其排除在产生大多数警告之外。)

https://gcc.gnu.org/onlinedocs/cpp/System-Headers.html

【讨论】:

    【解决方案2】:

    你可以试试这个:

    #pragma GCC diagnostic push
    #pragma GCC diagnostic ignored "-Wvariadic-macros"
    #define FOO(A, ...) foo(A, ##__VA_ARGS__)
    #pragma GCC diagnostic pop
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    • 2018-01-13
    • 2011-04-03
    相关资源
    最近更新 更多