我试着检查为一个简单的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
- 这些线条是什么意思
- 有没有什么文件我应该阅读,或者我必须了解任何特定主题才能理解这份文件
http://tigcc.ticalc.org/doc/comopts.html
-E
预处理阶段结束后停止;不要正确运行编译器。输出的形式是经过预处理的源代码被发送到标准输出。
不需要预处理的输入文件将被忽略。
然后您可以在gcc文档中找到"预处理器输出":
# linenum filename flags
这些被称为线条标记。根据需要将它们插入输出(但从不在字符串或字符常量内(。他们的意思是以下行源自文件filename的linenum行。filename永远不会包含任何非打印字符;他们是替换为八进制转义序列。
文件名之后出现零个或多个标志,它们是"1"、"2"、"3",或"4"。如果有多个标志,则用空格将它们隔开。这是标志的含义:
'1'这表示新文件的开始。
"2"这表示返回到一个文件(在包含另一个文件之后(。
- "3"这表示以下文本来自系统头文件,因此应取消某些警告
- "4"这表示以下文本应被视为包装在隐式外部"C"块中
行号信息。
如果编译经过预处理的输出,这些输出可以用来查找原始源的行号和文件。