3

从 Emacs 编译 .cpp 文件时M-x compile(运行文件夹的 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 此文件包含至少一个已弃用或过时的标头,将来可能会在不另行通知的情况下将其删除。请改用具有等效功能的非弃用接口。有关替换标头和接口的列表,请参阅文件backward_warning.h. 要禁用此警告,请使用-Wno-deprecated.

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

我正在使用 Emacs24.2.1gcc-4.4.5-x86_64.

4

3 回答 3

4

实际触发警告的构造(#warning在本例中为预处理器指令)位于file4. 上面的东西是#include堆栈的痕迹,最里面但首先是一个:在这种情况下,file3包括file2,包括file1,包括file4

当 gcc 知道触发诊断的构造的列号时,它会打印文件名、冒号、行号、另一个冒号和列号,正如您在该file4行中看到的那样。第一个数字是行号(28),第二个数字是列号(在这种情况下,您会发现#of#warning在第 2 列中)。当 gcc知道列号时,它只打印文件名、冒号和行号。堆栈就是这种情况#include,因为它不需要记录确切的#include指令列。Emacs 的编译模式理解如何解析这两种语法:你会发现如果你使用C-x  `要翻阅诊断,当有可用的列号时,Emacs 会将光标放在相应的列上。

这些报告末尾的冒号和逗号只是为了符合英语标点符号的约定;他们没有任何意义。

于 2012-10-09T19:28:37.827 回答
2
  1. 警告是在 file4.h 的第 28 行生成的。

  2. 逗号是因为您在列表的中间,冒号表示列表的结尾。这两个数字是行号和列号。

于 2012-10-09T19:25:58.990 回答
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,而其他所有文件仅作为包含在此文件中的结果进行解析。

于 2012-10-09T19:44:56.107 回答