我想启用——从字面上看——所有 GCC 具有的警告。 (你会认为这很容易...)
我如何告诉 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 .
另见 -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/