“g ++ -Wall test.cpp -o test”中的“-Wall”是干什么用的?

-o更改输出文件名(我发现使用–help)

但我找不到什么 – -Wall

它是“警告所有人”的简称 – 几乎可以打开g ++可以告诉你的所有警告。 通常,一个好主意,特别是如果你是初学者,因为理解和修复这些警告可以帮助你解决代码中的许多不同types的问题。

见man gcc。

– 墙上打开这些警告:

 -Waddress -Warray-bounds (only with -O2) -Wc++0x-compat -Wchar-subscripts -Wenum-compare (in C/Objc; this is on by default in C++) -Wimplicit-int (C and Objective-C only) -Wimplicit-function-declaration (C and Objective-C only) -Wcomment -Wformat -Wmain (only for C/ObjC and unless -ffreestanding) -Wmissing-braces -Wnonnull -Wparentheses -Wpointer-sign -Wreorder -Wreturn-type -Wsequence-point -Wsign-compare (only in C++) -Wstrict-aliasing -Wstrict-overflow=1 -Wswitch -Wtrigraphs -Wuninitialized -Wunknown-pragmas -Wunused-function -Wunused-label -Wunused-value -Wunused-variable -Wvolatile-register-var 

-Wextra包含:

 -Wclobbered -Wempty-body -Wignored-qualifiers -Wmissing-field-initializers -Wmissing-parameter-type (C only) -Wold-style-declaration (C only) -Woverride-init -Wsign-compare -Wtype-limits -Wuninitialized -Wunused-parameter (only with -Wunused or -Wall) -Wunused-but-set-parameter (only with -Wunused or -Wall) 

还有更多的警告你必须明确地打开。

例如我们使用的C代码:

-Wall -Wextra -Waggregate-return -Wcast-align -Wcast-qual -Wdisabled-optimization -Wdiv-by-zero -Wendif-labels -Wformat-extra-args -Wformat-nonliteral -Wformat-security -Wformat -y2k -Wimplicit -Wimport -Winit-self -Winline -Winvalid -pch -Wjump-misses-init -Wlogical-op -Werror = missing-braces -Wmissing-declaration -Wno-missing-format-attribute -Wmissing-include-dirs -Wmultichar -Wpacked -wpointer-arith -Wreturn-type -Wsequence-point -Wign-compare -Wstrict-aliasing -Wstrict-aliasing = 2 -Wswitch -Wwitch-default -Werror = undef -Wno -unused -Wavaari-macros -Wwrite-strings -Wc ++ -compat -Werror =声明后声明-Werror =隐式函数声明-Wmissing-prototypes -Werror =嵌套-Externs -Werror =旧样式定义-Werror = strict-prototypes

令人遗憾的是,没有任何答案引用手册的实际相关部分,这实际上引起了一个问题:

这使得所有关于某些用户认为可疑的构造的警告都很容易避免(或者修改以防止警告),即使与macros相结合也是如此。

[…]

请注意,一些警告标志并不是由-Wall隐含的。 他们中的一些人警告用户一般不认为有问题的build筑,但有时你可能希望检查; 其他人则警告在某些情况下必须或难以避免的构造,并且没有简单的方法来修改代码来压制警告。 其中一些是由-Wextra启用,但其中许多必须单独启用。

人机工程学:

  • -Wall并不意味着“所有警告”。
  • 也不意味着“(几乎)全部”,而不是远射。
  • 确实意味着一系列必然会改变的个体select。

底线是关于你应该设置的警告的绝对最小值。 虽然-Wall -Wextra更好,但它仍然没有使用所有的错误检查你的编译器可以为你做什么。


我个人不会低于-Wall -Wextra -Wfloat-equal -Wundef -Wcast-align -Wwrite-strings -Wlogical-op -Wmissing-declarations -Wredundant-decls -Wshadow -Woverloaded-virtual 。 我当前的所有项目实际上都使用比这更长的警告列表(不会触发任何警告)。 而且我会在每个主要版本上查看手册以寻找新选项。 编译器是你的朋友。 使用它可以为您提供的任何诊断。

它可以启用海湾合作委员会作者认为有用容易避免的警告。 在新版本中也有-W(-Wextra),它们被认为是有用的,但是对于这些工作来说,误报可能很困难,或者导致代码笨拙。

海湾合作委员会也有一堆其他警告,一般不太有用。 请参阅http://gcc.gnu.org/onlinedocs/gcc-4.4.3/gcc/Warning-Options.html#Warning-Options

它启用所有警告。 (读作“全部警告”)

enables most warning messages

如果你使用g++ --help=warnings你可以find更多。

它显示所有的警告。 我build议也使用-pedantic来警告一些不符合规范的代码部分。