如何使用GCC的pragma启用选项“-Werror”?

5

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

我尝试过像6.57.10 诊断指令中所述的#pragma GCC diagnostic error "-Wall",但它无法考虑到其他已启用的警告类型:

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

是否有一种方法可以像从命令行提供的那样启用-Werror文件(或者至少是隐式启用的警告集),以便任何警告都会触发错误?


我只在clang上尝试过这个,它试图与gcc兼容,但是#pragma GCC diagnostic error "-Wall"(不带[]括号)似乎完全正常。您链接中的文档在任何示例中都没有括号,所以我不确定为什么您会有它们。打字错误? - Mike Housky
2个回答

1
对于这种情况,您可以使用。
#pragma GCC diagnostic error "-Wincompatible-pointer-types"

例如:

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

void bar() {
        foo("foo");
}

在这个编译指示中使用-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"来纠正。如果我需要经常这样做,我会创建一个头文件来定义我想要生成的错误的pragma。 - Jonathan Leffler

0
作为一种解决方法,事实证明-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 -Wparentheses -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

列表可能随时间而变化。 另一方面,对基于版本的列表进行诊断错误可能是一个坏主意,因为它可能会破坏那些可能使用与开发人员不同版本的工具链版本的用户的编译(-Werror 因此臭名昭著),因此明确列出所需的警告对公共关系有好处。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接