如何查询 C++ 的 GCC 警告?

How to query GCC warnings for C++?

GCC 允许使用以下语法查询特定于 C++ 语言的可用警告标志:

g++ -Q --help=warning,c++

向调用添加警告标志会在结果中包含它们:

g++ -Wall -Q --help=warning,c++

但是,从C 的角度看来调用是完成的,而我不知道如何从C++ 的角度进行调用。如果调用包含仅 C++ 警告,例如:

g++ -Wnon-virtual-dtor -Q --help=warning,c++

输出包含一条消息:

cc1: warning: command line option ‘-Wnon-virtual-dtor’ is valid for C++/ObjC++ but not for C

并且仍然将警告显示为已禁用:

  -Wnon-virtual-dtor                    [disabled]

请注意,无论调用是使用 g++ 还是 gcc,都会发生这种情况。

与仅 C 相同 -Wbad-function-cast 以预期的方式运行:

gcc -Wbad-function-cast -Q --help=warning,c

[disabled][enabled] 之间没有额外的消息和报告的警告状态变化。同样,无论使用 g++ 还是 gcc

我使用的是 GCC 7.3.0 版。尽管这个问题似乎适用于许多(如果不是所有)版本。 It can be observed through Compiler Explorer.

那么,有没有办法针对给定的语言执行此查询?

是的,你的观察是正确的。

这可能不是预期的行为,如果您关心此功能,那么我建议向上游报告。

请注意,这有效,但是:

touch 1.cc
g++ -Wnon-virtual-dtor -Q --help=warning,c++ 1.cc

即如果存在具有正确扩展名的输入文件,则会调用正确的编译器正确的可执行文件:cc1plus,而不是 cc1。如果不存在输入文件,则后者是默认值。我进行了一些快速调试,结果如下:

// gcc.c:
driver::do_spec_on_infiles () const
{
  ...
  for (i = 0; (int) i < n_infiles; i++)
    {
      ...
      /* Figure out which compiler from the file's suffix.  */

      input_file_compiler
        = lookup_compiler (infiles[i].name, input_filename_length,
                           infiles[i].language);

      if (input_file_compiler)
        {
          ...
              value = do_spec (input_file_compiler->spec);

input_file_compiler此时是C编译器,因为

p n_infiles
 = 1
(gdb) p infiles[0]
 = {name = 0x4cbfb0 "help-dummy", language = 0x4cbfae "c", incompiler = 0x58a920, compiled = false, preprocessed = false}

虚拟文件的创建方式如下(同一文件中的函数 process_command):

  if (n_infiles == 0
      && (print_subprocess_help || print_help_list || print_version))
    {
      /* Create a dummy input file, so that we can pass
         the help option on to the various sub-processes.  */
      add_infile ("help-dummy", "c");
    }