如何禁用特定的gcc技术警告?

8
我已经搜索了很多次,但谷歌要么没有结果,要么就是无法做到。当你打开-Wpedantic时,会出现这个警告……

ISO C++ forbids zero-size array ‘variable’ [-Wpedantic]

我想关闭这个警告,而不是所有的pedantic警告。 通常,我只需要添加-Wno-xyz,但我找不到与该警告相关的标志名称,它在任何地方都没有列出。 是否有特殊的pedantic警告,不能单独移除它们?
2个回答

14

好消息是:你能够做到这一点。坏消息是:你不能使用任何命令行选项。[-Wpedantic] 在诊断末尾告诉你,-Wno-pedantic 是最窄的选项,可以禁用该诊断,但如果你想保留所有其他严谨的诊断,则无济于事。

你需要通过pragma逐个处理。

main.cpp

int main(int argc, char *argv[])
{
    int a[0];
    int b[argc];
    return sizeof(a) + sizeof(b);
}

这个程序会引发两个-Wpedantic诊断:

$ g++ -Wpedantic -c main.cpp
main.cpp: In function ‘int main(int, char**)’:
main.cpp:6:12: warning: ISO C++ forbids zero-size array ‘a’ [-Wpedantic]
     int a[0];
            ^
main.cpp:8:15: warning: ISO C++ forbids variable length array ‘b’ [-Wvla]
     int b[argc];
               ^

-Wno-vla会抑制第二个警告。要抑制第一个,你需要采取以下措施:

main.cpp(已修订)

int main(int argc, char *argv[])
{
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wpedantic"
    int a[0];
#pragma GCC diagnostic pop
    int b[argc];
    return sizeof(a) + sizeof(b);
}

使用哪个:

$ g++ -Wpedantic -c main.cpp
main.cpp: In function ‘int main(int, char**)’:
main.cpp:8:15: warning: ISO C++ forbids variable length array ‘b’ [-Wvla]
     int b[argc];
               ^

1
那真的很特别。谢谢。 - stu
你也可以将其包装在包含文件中,以防止无法控制的有害代码。 - Jamey Hicks
2
宏警告可以实现吗?比如,空参数列表的可变参数宏是否会引发警告“ISO C++11要求可变参数宏中的“…”至少有一个参数”? - C--

0

好的,你可以使用一个pragma来禁用它,但如果你想要可移植性,你可以使用一个零大小的std::array代替:

#include <array>
//...

std::array<int, 0> ar;

无论如何,建议使用std::array而不是普通数组。


是的,我可以改变很多东西来使它工作不同,但现在我真正想做的就是关闭那个警告,但我做不到。哦,算了。 - stu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接