在使用 gcc 编译的文件(几个 .c 和 .cpp 文件)中,我目前有类似的内容:
#if defined(__GNUC__) && !defined(__clang__)
#pragma GCC diagnostic warning "-Wall"
#endif
指定内联选项而不是仅使用命令行的目的是控制在哪些点之后我有兴趣变得更严格(例如,在列表之后#include
)。
效果很好。然后我尝试添加-Wextra
:
#if defined(__GNUC__) && !defined(__clang__)
#pragma GCC diagnostic warning "-Wall -Wextra"
#endif
它失败。显然,您不能在单个 中使用多个选项pragma
,而必须使用多行:
#if defined(__GNUC__) && !defined(__clang__)
#pragma GCC diagnostic warning "-Wall"
#pragma GCC diagnostic warning "-Wextra"
#endif
- Q1:有没有办法内联指定多个选项?
接下来,我尝试添加-Werror
and -pedantic
,但既不使用diagnostic warning
也不diagnostic error
工作。例子:
#pragma GCC diagnostic error "-Werror"
失败并显示:warning: ‘-Werror’ is not an option that controls warnings
. 我该如何解决这个问题?除此之外还有哪些其他选择diagnostic [warning|error]
?-pedantic
或呢-pedantic-errors
?因为我知道迂腐主要与标准合规性而不是诊断控制有关,而且我不知道我是否可以内联指定它。
好吧,你不能。就是这样。
您可以打开或关闭特定警告,或者将它们变成错误,但您无法
#pragma
按照您注意到的那样执行所有操作。注意"-Wpedantic"
还是可以控制的。一般来说,我仍然将大多数选项放入构建文件中,包括
-Werror
. 我认为不断切换代码段的警告并不是一个好主意。在某些标头发出警告的(罕见)情况下,我使用编译指示来禁用该标头的警告 -
push
设置、禁用警告、包含标头、pop
设置。这导致了像这样的结构但是,我不会在自己的代码中使用这样的东西 - 相反,我修复代码中的警告,或者从构建系统中删除警告(如果它太烦人)。
如果由于某种原因必须在一行上写出编译指示,因为您正在制作类似函数的宏或类似宏,则可以使用
_Pragma
与 类似#pragma
但可以更灵活地使用的运算符。它的工作原理完全相同,只需压缩您#pragma
在字符串文字中输入的内容即可。如果您输入的内容恰好是字符串文字,则添加转义序列\"
。例子:
printf
这给了我第一行的警告但不适合第二个。
并非所有编译器选项都可以这样使用,就这么简单。基本上只有
-W...
那些有效。请参阅https://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html正如 @Christian Stieber 在另一个答案中指出的,
-Wpedantic
这是启用该特定选项的解决方法。