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

问题描述 投票:0回答:7

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

但我不知道

-Wall
有什么作用?

c++ g++
7个回答
126
投票

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


49
投票

参见 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-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 -W逻辑操作 -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=嵌套外部 -Werror=旧式定义 -Werror=严格原型

或者只是一组警告 https://www.gnu.org/software/autoconf-archive/ax_compiler_flags.html, src


25
投票

遗憾的是,没有一个答案引用手册中实际相关的部分,这确实说明了这一点:

这会启用一些用户考虑的有关结构的所有警告 有问题的,并且很容易避免(或修改以防止警告), 即使与宏结合使用。

[...]

请注意,

-Wall
并不暗示某些警告标志。其中一些人警告 关于用户通常认为没有问题的结构,但是 有时您可能希望检查一下;其他人则对以下建筑提出警告: 在某些情况下是必要的或难以避免的,并且没有简单的方法可以 修改代码以抑制警告。其中一些是通过
-Wextra
启用的 但其中许多必须单独启用。

因此:

  • -Wall
    not 是否意味着“所有警告”。
  • 它也not意味着“(几乎)全部”,远非如此。
  • 确实意味着一组单独的选项必然会改变

底线,这是您应该设置的绝对最少警告。虽然

-Wall -Wextra
更好,但它仍然没有利用编译器可以为您完成的所有错误检查。


就我个人而言,我不会低于

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


6
投票

它启用了 gcc 编写者认为有用且易于在源头避免的警告。还有 -W(较新版本中的 -Wextra)被认为很有用,但解决误报可能很困难或导致笨拙的代码。 gcc 还有很多其他警告,通常不太有用。请参阅

http://gcc.gnu.org/onlinedocs/gcc-4.4.3/gcc/Warning-Options.html#Warning-Options


2
投票
enables most warning messages


如果您使用

g++ --help=warnings

,您可以了解更多信息。

    


0
投票


-1
投票
-pedantic

来警告代码中的一些不合格部分。

    

© www.soinside.com 2019 - 2024. All rights reserved.