理解和解析来自gcc的警告

3

当通过Emacs编译.cpp文件(通过运行文件夹中的Makefile)时,我在编译缓冲区中看到以下内容(在编译模式下显示):

In file included from: /path/to/file1:60,
  from /path/to/file2.h:15,
  from /path/to/file3.cpp:16: 

/path/to/file4.h:28:2: #warning This file includes at least one deprecated or antiquated header which may be removed without further notice at a future date. Please use a non-deprecated interface with equivalent functionality instead. For a listing of replacement headers and interfaces, consult the file backward_warning.h. To disable this warning use -Wno-deprecated.

  • 除了实际的警告信息,我应该如何理解这个trace?即哪个文件生成了警告?(file1,file2, file3file4)?
  • 另外,为什么在file2行后面有一个逗号,在file3行后面有一个冒号,在包含file4的那一行中有两个用两个冒号分隔的数字?

我正在使用 Emacs 24.2.1gcc-4.4.5-x86_64

3个回答

4
实际触发警告的结构(在本例中为预处理器指令#warning)位于file4中。上面的内容是#include堆栈的跟踪,从内部第二个开始:在这种情况下,file3包含file2,后者包含file1,后者又包含file4
当gcc知道触发诊断的结构的列号时,它会打印文件名、冒号、行号、另一个冒号和列号,就像你在file4行看到的那样。第一个数字是行号(28),第二个数字是列号(在这种情况下,你会发现#warning#在第2列)。当gcc不知道列号时,它只会打印文件名、冒号和行号。这是#include堆栈的情况,因为它不会记录#include指令的确切列数。Emacs的编译模式知道如何解析这两种语法:如果您使用C-x  `翻阅诊断信息,当有列号可用时,Emacs将把光标放在适当的列上。
这些报告末尾的冒号和逗号只是为了符合英语标点惯例,它们没有实际意义。

2
  1. 警告是在file4.h文件的第28行产生的。

  2. 逗号是因为你正在列表中间,冒号表示列表结束。两个数字分别代表行号和列号。


谢谢!为什么有一个列表?“gcc”是否足够聪明,知道我从三个不同的文件(file1、file2、file3)中包含了file4.h - Josh
另外,为什么在 file3file4 的条目之间有一个 冒号(而不是 逗号)? - Josh
1
@useer0000001:我修复了你的格式,这样列表的原因可能更明显了。你将获得完整的包含列表跟踪。 - Kerrek SB

1

实际上显示它的编译路径,如下所示:

in column 2 of line 28 of file4.h
that included from file1.h(line 60)
that included from file2.h(line 15)
that included from file3.cpp(line 16)
there was a warning ...

每个编译器都应该保持这个轨迹,这与GCC是否聪明无关! 因为你的编译器只编译file3.cpp,而其他文件只会作为此文件包含的结果进行解析。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接