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


91

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

但是我不知道-Wall是什么?


7
控制台上的“ man gcc”会告诉您有关此标志的所有信息,以及带有“ gcc -Wall”的简单google搜索...
David Sauter 2010年

作为一般提示,man如果您想知道某个开关的作用或可用的开关,请尝试阅读程序的条目。的man页面gcc可以在linux.die.net/man/1/gcc阅读-您可以在那里快速搜索文本“ -Wall”
gnud

5
@David Sauter,Google将找不到带有“ -wall”的任何内容。它将从搜索中排除所有“墙”。
Kirill V. Lyadvinsky 2010年

@Kirill不,如果您使用引号,就像我猜大卫的意思
gnud

1
//,我一直认为这是对Larry Wall的致敬。
弥敦道(Nathan Basanese),2015年

Answers:


109

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


24
可以使用-Wextra和打开更多警告(其中一些非常有用)-pedantic
gnud 2010年

7
并非全部。实际上,这只是可用警告的一小部分。这是“所有人”都同意的。在真正的好主意,就是做-Wall -Wextra,然后仔细阅读手册,以找到尽可能多的更多的警告,你可以启用越好,因为即使-Wextra是只有一小部分...
DevSolar

@DevSolar非常好。您是否知道是否有一个标志表示“字面上所有警告”?
MatrixFrog 2014年

1
@MatrixFrog:不幸的是,没有这样的选择,至少对于我所知道的编译器来说没有。而且可用警告的列表会随着时间而变化...如果GCC团队没有在-Wunreachable-code一段时间之前禁用它,那么这些天苹果会快乐。;-)
DevSolar 2014年

35

参见man gcc。

-Wall打开以下警告:

-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返回-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 -Wologic-op -Werror = missing-braces -Wmissing-declarations -Wno-missing-format-attribute -Wmissing-include-dirs -Wmultichar -Wpacked -Wpointer-arith -Wreturn-type -Wsequence-point -Wsign-compare -Wstrict-aliasing -Wstrict-aliasing = 2 -Wswitch -Wswitch-default -Werror = undef -Wno-unused -Wvariadic-macros -Wwrite-strings -Wc ++ -compat -Werror =声明后声明-Werror =隐式函数声明-Wmissing-prototypes -Werror = nested-externs -Werror = old-style-definition -Werror = strict-prototypes

或仅使用https://www.gnu.org/software/autoconf-archive/ax_compiler_flags.html发出的警告集


19

可悲的是,没有任何答案引用了手册的实际相关部分,这确实使它指向了重点:

这将启用所有有关某些用户认为可疑的构造的警告,即使与宏结合使用,也很容易避免(或进行修改以防止出现警告)。

[...]

请注意,并未暗示某些警告标志-Wall。他们中的一些人警告用户通常认为不会有问题的结构,但有时您可能希望检查一下。其他人警告在某些情况下必须避免的结构,没有简单的方法来修改代码以抑制警告。其中一些已启用,-Wextra 但其中许多必须单独启用。

Ergo:

  • -Wall不会意味着“所有警告”。
  • 也不意味着“(几乎)全部”,不是长远考虑。
  • 确实意味着必定会发生变化的一组单个选项。

底线是您应设置的警告的绝对最小值。虽然-Wall -Wextra较好,但仍然没有利用错误检查你的编译器可以为你做的一切。


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


我已经开始学习使用C ++进行编程。我使用编程原理,并使用cpp进行练习。我的系统是ubuntu 16.04,我使用vscode作为编辑器。您是否建议我在学习c ++和编程时同时使用您的-Wall -Wextra -Wfloat-equal -Wundef -Wcast-align -Wwrite-strings -Wlogical-op -Wmissing-declarations -Wredundant-decls -Wshadow -Woverloaded-virtual编译g++ -std=c++11器?还是应该跳过这一部分,稍后再开始使用错误消息标志?如果是这样,什么时候应该从错误消息开始?
scientific_explorer

2
@vkv:我相信编译器确实是您的朋友,您应该利用编译器可以为您提供的每一个好建议。
DevSolar


2

enables most warning messages

如果您使用,则可以了解更多信息g++ --help=warnings


-1

它启用所有警告。(读为“警告所有”)


实际上,有很多警告并未启用(例如,具有虚拟方法的类中的非虚拟dtor)。
Mark B 2010年

请参见Yuval的回答:-Wall只是表示“大多数警告”,而不是“所有警告”。
HaxtraZ

-1

它显示所有警告。我还建议您使用-pedantic来警告某些不符合标准的代码部分。


对于gcc doc:“有些用户尝试使用-pedantic检查程序是否符合严格的ISO C要求。他们很快发现它并没有达到他们想要的功能:它找到了一些非ISO的实践,但不是全部-仅针对那些ISO C需要诊断,还有一些已添加诊断的诊断。”
AProgrammer

它不会提供100%的保证,但会有所帮助。
Kirill V. Lyadvinsky 2010年

1
如果您没有在“警告所有不合格的部分”中写一些而不是全部,那么我不会发表评论。但是您当前的表述只是散布了gcc文档所警告的误解。
A程序员

固定。但是实际上,它看起来像是“大多数”而不是“某些”。
Kirill V. Lyadvinsky 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.