1

我试图检查为一个简单的 hello world 程序生成的翻译单元的样子。因此,我在 test.cpp 中编写了以下代码。

#include <iostream>
using namespace std;

int main()
{
    cout<<"Hello World"<<endl;
}

然后,我使用带有 -E 选项的 g++ 编译了上述文件,并将数据输出到临时文件。该文件具有 c++ 代码,其间的行以 # 符号开头。

像下面这样的东西,

# 1 "test.cpp"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "test.cpp"
# 1 "/usr/include/c++/8/iostream" 1 3
# 36 "/usr/include/c++/8/iostream" 3
  1. 这些线是什么意思?
  2. 是否有任何我应该阅读的文件,或者我是否必须了解任何特定主题的知识才能理解这个文件?
4

2 回答 2

2

http://tigcc.ticalc.org/doc/comopts.html

-E

预处理阶段后停止;不要正确运行编译器。输出采用预处理源代码的形式,发送到标准输出。

不需要预处理的输入文件将被忽略。

然后您可以在 gcc 文档中找到“预处理器输出”

# linenum filename flags

这些被称为线标记。它们根据需要插入到输出中(但从不在字符串或字符常量中)。他们的意思是以下行起源于 linenum 处的文件文件名。文件名永远不会包含任何非打印字符;它们被八进制转义序列替换。

文件名后面有零个或多个标志,它们是“1”、“2”、“3”或“4”。如果有多个标志,则用空格分隔它们。以下是标志的含义:

  • '1' 这表示一个新文件的开始。

  • '2' 这表示返回到一个文件(在包含另一个文件之后)。

  • '3' 这表示以下文本来自系统头文件,因此应禁止某些警告。
  • '4' 这表示以下文本应被视为包含在隐式 extern "C" 块中。
于 2018-12-12T16:41:00.137 回答
0

行号信息。

如果您编译预处理的输出,这些可以用于查找原始源代码的行号和文件。

于 2018-12-12T16:45:04.520 回答