如何查询 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");
}
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");
}