c++ - 我怎样才能打开(字面上)所有 GCC 的警告?

标签 c++ gcc warnings compiler-warnings gcc-warning

我想启用——从字面上看——所有 GCC 具有的警告。 (你会认为这很容易...)

  • 你会想 -Wall可能会成功,但不行!你还需要 -Wextra .

  • 您可能认为 -Wextra 可以解决问题,但不是!并非所有列出的警告 here (例如,-Wshadow)由此启用。我仍然不知道这个列表是否全面。

我如何告诉 GCC 启用(没有如果,和,或但是!)所有它有的警告?

最佳答案

你不能。

GCC 4.4.0 的手册仅针对该版本进行了全面介绍,但它确实列出了 4.4.0 的所有可能警告。它们并不都在您链接到的页面上。例如,一些特定于语言的选项位于 C++ 选项或 Objective-C 选项的页面上。要找到所有这些,您最好查看 Options Summary

打开everything 将包括-Wdouble-promotion,它仅与具有实现float 的32 位单精度浮点单元的CPU 相关 在硬件中,但在软件中模拟 double。以 double 的形式进行计算会使用软件模拟并且速度会更慢。这与某些嵌入式 CPU 相关,但与硬件支持 64 位浮点的现代桌面 CPU 完全无关。

另一个通常没有用的警告是 -Wtraditional,它会警告在传统 C 中具有不同含义(或不起作用)的完美格式代码,例如,"string ""连接",或 ISO C 函数定义!您真的关心与 30 年前编译器的兼容性吗?你真的想要警告编写 int inc(int i) { return i+1; 吗? }?

我认为 -Weffc++ 太嘈杂而无用。它基于过时的第一版 Effective C++ 并警告完全有效的 C++ 构造(并且在本书的后续版本中更改了指南)。我不想被警告说我还没有在我的构造函数中初始化一个 std::string 成员;它有一个默认的构造函数,它完全符合我的要求。为什么要写m_str()来调用呢?有用的 -Weffc++ 警告对于编译器来说太难准确检测(给出假阴性),而那些无用的警告,例如显式初始化所有成员,只会产生太多噪声,给出误报。

Luc Danton 提供了一个 great example来自 -Waggregate-return 的无用警告几乎肯定对 C++ 代码毫无意义。

即,您并不真的想要所有警告;你只是认为你这样做。

通读手册,阅读它们,决定您可能想要启用哪些,然后尝试它们。无论如何,阅读你的编译器手册是一件好事TM,走捷径并启用你不理解的警告并不是一个好主意,特别是如果它是为了避免必须 RTFM .

Anyone who just turns on everything is probably either doing so because they're clueless because or a pointy-haired boss said "no warnings."

Some warnings are important, and some aren't. You have to be discriminating or you mess up your program. Consider, for instance, -Wdouble-promotion. If you're working on an embedded system you might want this; if you're working on a desktop system you probably don't. And do you want -Wtraditional? I doubt it .

另见 -Wall-all to enable all warnings关闭为 WONTFIX

针对 DevSolar 关于 makefile 需要根据编译器版本使用不同警告的提示,如果 -Wall -Wextra 不合适,那么使用特定于编译器和特定于版本的 CFLAGS 并不困难:

compiler_name := $(notdir $(CC))
ifeq ($(compiler_name),gcc)
compiler_version := $(basename $(shell $(CC) -dumpversion))
endif
ifeq ($(compile_name),clang)
compiler_version := $(shell $(CC) --version | awk 'NR==1{print $$3}')
endif
# ...
wflags.gcc.base := -Wall -Wextra
wflags.gcc.4.7 := -Wzero-as-null-pointer-constant
wflags.gcc.4.8 := $(wflags.gcc.4.7)
wflags.clang.base := -Wall -Wextra
wflags.clang.3.2 := -Weverything
CFLAGS += $(wflags.$(compiler_name).base) $(wflags.$(compiler_name).$(compiler_version))

关于c++ - 我怎样才能打开(字面上)所有 GCC 的警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23998654/

相关文章:

linux - GCC 选项的 -shared 和 -Wl,-shared 的区别

C 局部变量地址返回警告

c++ - 声明一个可以将lambda用作参数的函数,但该lambda必须能够捕获其他变量

c - 在内联汇编器中使用寄存器

c++ - 针对非类型参数特定值的模板代码优化。

gcc - 为什么生成的程序集将 edi 移动到堆栈上的变量?

php - "Notice: Undefined variable"、 "Notice: Undefined index"、 "Warning: Undefined array key"和 "Notice: Undefined offset"使用 PHP

fortran - 抑制未使用的变量警告

c++ - clang : error: linker command failed with exit code 1 (use -v to see invocation) in C++ code

c# - 如何将数据从非托管应用程序传递到 C# COM DLL