g++-E中以#符号开头的行是如何生成翻译单元的



我试着检查为一个简单的helloworld程序生成的翻译单元是什么样子的。所以,我在test.cpp.中写了以下代码

#include <iostream>
using namespace std;
int main()
{
cout<<"Hello World"<<endl;
}

然后,我用g++和-E选项编译了上面的文件,并将数据输出到一个临时文件中。该文件包含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. 有没有什么文件我应该阅读,或者我必须了解任何特定主题才能理解这份文件

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

-E

预处理阶段结束后停止;不要正确运行编译器。输出的形式是经过预处理的源代码被发送到标准输出。

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

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

# linenum filename flags

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

文件名之后出现零个或多个标志,它们是"1"、"2"、"3",或"4"。如果有多个标志,则用空格将它们隔开。这是标志的含义:

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

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

  • "3"这表示以下文本来自系统头文件,因此应取消某些警告
  • "4"这表示以下文本应被视为包装在隐式外部"C"块中

行号信息。

如果编译经过预处理的输出,这些输出可以用来查找原始源的行号和文件。

相关内容

  • 没有找到相关文章

最新更新