【问题标题】:How can I enable -Werror using a GCC pragma?如何使用 GCC 编译指示启用 -Werror?
【发布时间】:2019-11-20 13:53:57
【问题描述】:

我有一些文件需要严格处理警告,我使用 GCC 来构建我的项目。

我已经按照 6.57.10 Diagnostic Pragmas 尝试了#pragma GCC diagnostic error "[-Wall]",但它无法解决其他一些已启用的警告类型:

foo.c:666:6: warning: passing argument 2 of 'bar' from incompatible pointer type [-Wincompatible-pointer-types]

有没有办法为文件启用-Werror,就像它是从命令行提供的一样(或者,至少,对于隐式启用的一组警告),所以任何警告都会触发错误?

【问题讨论】:

    标签: c++ c gcc


    【解决方案1】:

    对于这种情况,你可以使用

    #pragma GCC diagnostic error "-Wincompatible-pointer-types"
    

    例如

    #pragma GCC diagnostic error "-Wincompatible-pointer-types"
    void foo(int * a)
    {
    }
    
    void bar() {
            foo("foo");
    }
    

    不支持将此 pragma 与 -Wall 一起使用。仅支持诊断选项,显示为-fdiagnostics-show-option(无论如何都是今天的默认值),如上面的警告示例。

    【讨论】:

    • 至少对于 GCC 7.2.0 及更高版本,#pragma GCC diagnostics error "-Wall"#pragma GCC diagnostics error "-Wextra" 似乎将大量警告转换为错误。但是,似乎确实存在一些盲点——我还发现-Wpointer-compare 没有转换为错误。此类遗漏可通过#pragma GCC diagnostics error "-Wpointer-compare" 更正。如果我需要定期执行此操作,我会创建一个标头来为我想要生成的错误定义 pragmata。
    【解决方案2】:

    作为一种解决方法,-Wall 选项的当前语义在手册页中进行了描述。在我的 GCC 8.3.0 的情况下,它表示它启用了以下可以在之后与 pragma 一起使用的选项:

    -Waddress -Warray-bounds=1(仅适用于 -O2) -Wbool-compare -Wbool-operation -Wc++11-compat -Wc++14-compat -Wcatch-value(仅限 C++ 和 Objective-C++ ) -Wchar-subscripts -Wcomment -Wduplicate-decl-specifier (C 和 Objective-C 仅)-Wenum-compare(在 C/ObjC 中;在 C++ 中默认启用)-Wformat -Wint-in-bool-context -Wimplicit(仅 C 和 Objective-C)-Wimplicit-int(C 和 Objective-C仅)-Wimplicit-function-declaration(C 和 Objective-C 仅)-Winit-self(仅适用于 C++)-Wlogical-not-parentheses -Wmain(仅适用于 C/ObjC,除非 -ffreestanding)-Wmaybe-uninitialized -Wmemset-elt-size -Wmemset-transposed-args -Wmisleading-indentation (仅适用于 C/C++) -Wmissing-attributes -Wmissing-braces (仅适用于 C/ObjC) -Wmultistatement-macros -Wnarrowing (仅适用于 C++) -Wnonnull -Wnonnull-compare -Wopenmp-simd -W括号 -Wpointer-sign -Wreorder -Wrestrict -Wreturn-type -Wsequence-point -Wsign-compare(仅在 C++ 中) -Wsizeof-pointer-div -Wsizeof-pointer-memaccess -Wstrict-aliasing -Wstrict-overflow=1 -Wstringop-truncation -Wswitch -Wtautological-compare -Wtrigraphs -Wuninitialized -Wunknown-pragmas -Wunused-function -Wunused-label -Wunused-value -Wunused-variable -Wvolatile-register-var

    列表可能会随着时间而改变。另一方面,diagnostic error 处理依赖于版本的列表可能不是一个好主意,因为它可能会破坏那些可能使用工具链的其他版本而不是开发人员的用户的编译(-Werror 是臭名昭著的) ,因此明确列出所需的警告有利于公共关系。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-01
      • 2018-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-10
      • 2010-12-31
      相关资源
      最近更新 更多