如何使用GCC编译指示启用选项'-Werror'?

mwg9r5ms  于 2022-11-12  发布在  其他
关注(0)|答案(2)|浏览(326)

我有几个文件,我想严格警告,我使用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(或者,至少为隐式启用的警告集启用),以便任何警告都将触发错误?

bz4sfanl

bz4sfanl1#

对于这种情况,可以使用

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

例如在

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

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

不支持将-Wall与此pragma一起使用。仅支持诊断选项,这些选项与-fdiagnostics-show-option一起显示(这是目前的默认选项),如上面的示例警告所示。

pb3s4cty

pb3s4cty2#

作为一种解决方案,我们发现-Wall选项的当前语义是在the man page上描述的。在我的GCC 8.3.0的情况下,它说它启用了以下选项,这些选项可以在以后与pragma一起使用:
-Waddress -数组边界=1(仅限使用-O2)-Wbool-compare -Wbool-operation -Wc11-compat -Wc14-compat -Wcatch-值(仅限C和Objective-C)-Wchar-下标-Wcomment -Wduplicate-decl-说明符(仅限C和Objective-C)-Wenum-比较(在C/ObjjC中;这在C中是默认打开的)-Wformat -在布尔上下文中的Win-in-bool-context -Winimplicit(仅限C和Objective-C)-Winimplicit-int(仅限C和Objective-C)-Winimplicit-function-declaration(仅限C和Objective-C)-Winit-self(仅限C)-Wlogical-not-par括号-Wmain(仅限C/ObjC,除非是独立的)-Wmaybe-uninitialized-Wmemset-elt-size -Wmemset-转置-args -Wmisleading-indentation(仅适用于C/C++)-W缺少属性-W缺少大括号(仅适用于C/ObjC)-W多语句宏-W缩小(仅适用于C++)-W非空-W非空比较-W openmp-simd-W括号-W指针符号-W重新排序-W限制-W返回类型-W序列指针-W符号比较(仅适用于C++)-W指针大小-div -W指针大小-内存访问-W限制别名-W限制溢出=1 -W字符串操作截断-Wswitch -W同义字比较-W三角形-W未初始化-W未知编译指示-W未使用函数-W未使用标签-W未使用值-W未使用变量-W易失性寄存器-var
另一方面,diagnostic error覆盖依赖于版本的列表可能不是个好主意,因为它可能会破坏编译,因为用户可能会使用工具链的其他版本,而不是开发人员使用的版本(-Werror因此而声名狼借),因此明确列出所需的警告对公共关系是有好处的。

相关问题