【问题标题】:What does "-Wall" in "g++ -Wall test.cpp -o test" do?“g++ -Wall test.cpp -o test”中的“-Wall”有什么作用?
【发布时间】:2010-03-09 09:53:07
【问题描述】:

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

但我不知道-Wall 做了什么?

【问题讨论】:

  • "man gcc" 在您的控制台上告诉您有关此标志的所有信息以及使用“gcc -Wall”进行简单的谷歌搜索......
  • 作为一般提示,如果您想知道开关的作用或可用的开关,请尝试阅读程序的man 条目。 gccman 页面可以在 linux.die.net/man/1/gcc 上阅读 - 你可以在那里快速搜索文本“-Wall”
  • @David Sauter,谷歌找不到任何带有“-wall”的东西。它将从搜索中排除所有“墙”。
  • @Kirill 如果你使用引号就不会,就像我猜大卫的意思一样
  • // ,我一直以为这是对拉里·沃尔的致敬。

标签: c++ g++


【解决方案1】:

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

【讨论】:

  • 更多警告(其中一些非常有用)可以通过-Wextra-pedantic 打开。
  • 这不是(几乎)全部。它实际上只是可用警告的一小部分。这是“所有人”都同意的。 真的 好主意是执行-Wall -Wextra,然后仔细阅读手册以找到尽可能多的更多 警告,因为即使-Wextra 也只是一个小子集...
  • @DevSolar 非常好。你知道是否有一个标志表示“字面上的所有警告”?
  • @MatrixFrog:不幸的是,没有这样的选择,至少对于我所知道的编译器来说没有。并且可用警告列表会随着时间的推移而变化......如果 GCC 团队没有在一段时间前禁用 -Wunreachable-code,那么 Apple 这些天会更加更快乐。 ;-)
【解决方案2】:

参见 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 -Wlogical-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-字符串 -Wc++-compat -Werror=declaration-after-statement -Werror=implicit-function-declaration -Wmissing-prototypes -Werror=nested-externs -Werror=old-style-definition -Werror=strict-prototypes

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

【讨论】:

    【解决方案3】:

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

    这会启用一些用户认为的关于结构的所有警告 有问题,很容易避免(或修改以防止警告), 甚至与宏一起使用。

    [...]

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

    尔格:

    • -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++ 和编程的同时,我使用 g++ -std=c++11 编译时,您是否建议我使用您的 -Wall -Wextra -Wfloat-equal -Wundef -Wcast-align -Wwrite-strings -Wlogical-op -Wmissing-declarations -Wredundant-decls -Wshadow -Woverloaded-virtual?或者我应该跳过这部分并稍后开始使用错误消息标志?如果是这样,我应该什么时候开始显示错误消息?
    • @vkv:我相信编译器真的是你的朋友,你应该好好利用它能给你的每一点好建议。
    【解决方案4】:

    它启用了被认为有用的警告并且很容易被 gcc 编写者从源头上避免。还有 -W(较新版本中的 -Wextra)被认为很有用,但解决误报可能很困难或导致代码笨拙。

    gcc 还有很多其他警告,通常没那么有用。见http://gcc.gnu.org/onlinedocs/gcc-4.4.3/gcc/Warning-Options.html#Warning-Options

    【讨论】:

      【解决方案5】:

      enables most warning messages

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

        • 实际上有很多警告它没有启用(例如具有虚拟方法的类中的非虚拟dtor)。
        • 查看 Yuval 的回答:-Wall 仅表示“大多数警告”而不是“所有警告”。
        【解决方案7】:

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

        【讨论】:

        • 对于 gcc 文档:“一些用户尝试使用 -pedantic 来检查程序是否严格遵守 ISO C。他们很快发现它并没有达到他们想要的效果:它发现了一些非 ISO 实践,但不是全部——只有那些 ISO C 需要诊断的,以及其他一些需要诊断的。”
        • 它不能提供 100% 的保证,但它会有所帮助。
        • 如果你没有写 some 而不是 all 在“警告 all 不合格部分” ,我不会评论。但是您当前的表述只是传播了 gcc 文档警告的误解。
        • 已修复。但实际上它看起来更像是“大部分”而不是“一些”。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-01
        • 2013-09-24
        • 1970-01-01
        • 2021-05-17
        相关资源
        最近更新 更多