如何查询C++;? GCC允许使用C++语法查询特定的警告标志: g++ -Q --help=warning,c++

如何查询C++;? GCC允许使用C++语法查询特定的警告标志: g++ -Q --help=warning,c++,gcc,gcc-warning,Gcc,Gcc Warning,向调用中添加警告标志会将其包含在结果中: 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 f

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

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-only
相同-Wbad函数cast
的行为符合预期:

gcc -Wbad-function-cast -Q --help=warning,c
[禁用]
[启用]
之间没有额外的消息和报告的警告状态更改。同样,无论是使用
g++
还是
gcc

我使用的是GCC版本7.3.0。尽管这个问题似乎适用于许多版本,如果不是所有版本的话


那么,有没有一种方法可以对给定的语言执行此查询?

是的,您的观察是正确的

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

但请注意,这是可行的:

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);

以下是创建虚拟文件的方式(同一文件中的函数
process\u命令
):


我已经提交了一个bug:。顺便说一句,虚拟源文件技巧不适用于我的7.3.0。从这一点来看,它不适用于任何版本,包括目前的TOP9.1。它只适用于主干版本。此外,需要一个现有文件使其有点不完善。@AdamBadura“此外,需要一个现有文件使其有点不完善。”-作为另一种解决方法,您可以直接调用特定语言前端(
cc1plus
)。我认为,
gcc——打印文件名cc1plus
应该是获取可执行文件路径的一种可移植方式。“我提出了一个错误:……”-太好了!我认为,我们应该继续在那里进行讨论,把它放在一个地方。
p n_infiles
$9 = 1
(gdb) p infiles[0]
$10 = {name = 0x4cbfb0 "help-dummy", language = 0x4cbfae "c", incompiler = 0x58a920, compiled = false, preprocessed = false}
  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");
    }