自动知道 GCC/Clang 警告是来自 Wall 还是 Wextra?

Automatically know if a GCC/Clang warning comes from Wall or Wextra?

我想知道是否有一些聪明的自动方法可以知道特定的编译器警告(例如 -Wunused-parameter)是否来自组 -Wall-Wextra 或另一个组,因为GCC 和 Clang。

用例:我们要启用:

-Wall -Wextra -pedantic

然而,一些pedantic警告对我们不适用,我们想禁用它们,例如:

-Wall -Wextra -pedantic -Wno-c++20-designator

现在,我们要 100% 确定我们不会禁用 -Wall-Wextra 中的任何内容。我们如何确保 -Wc++20-designator 不属于其中任何一个?当然可以去查看文档,但是当你有很多这样的警告或者当你升级编译器并得到新的警告时,这是一个乏味的过程。

我们的用例确保所有 -Wall-Wextra 警告将始终处于活动状态,无论来自 -pedantic.

的禁用警告如何

谢谢!

没有特定的命令可以直接回答“给定警告来自哪个警告组?”这个问题,但是可以通过查询编译器启用了哪些警告并检查是否启用了我们感兴趣的警告是已启用警告列表的一部分。

这是按如下方式完成的:

  • GCC:gcc -Q -Wall --help=warnings | grep enabled | grep unused-parameter(感谢@dratenik)。
  • Clang:与 GCC 不同,此功能未内置到编译器中,因此我们需要使用 diagtool 工具:diagtool show-enabled -Wall foo.cpp | grep unused-parameter.

奖金: 与原始问题无关但与原始用例相关:要确保启用所有 WallWextra,无论禁用哪些警告,解决方案( 仅适用对于 Clang) 是将 Wall Wextra 放在最后:

clang -Wno-unused-parameter -Wall -Wextra

在这种情况下,如果我们不小心禁用了 unused-parameter 警告,Wall 将在之后应用,重新启用警告。