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

时间:2018-12-12 16:37:06

标签: c++ g++ translation-unit

我试图检查为简单的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. 是否需要阅读任何文档,或者必须了解任何特定主题的知识才能理解该文件?

2 个答案:

答案 0 :(得分:2)

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

  

-E

     

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

     

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

然后您可以找到"Preprocessor Output" in gcc documentation

# linenum filename flags
     

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

     

文件名出现零个或多个标志后,分别是“ 1”,“ 2”,“ 3”,   或“ 4”。如果有多个标志,请用空格分隔它们。这是   标志的含义:

     
      
  • “ 1”表示新文件的开始。

  •   
  • ‘2’这表示返回一个文件(包含另一个文件之后)。

  •   
  • “ 3”这表示以下文本来自系统头文件,因此应禁止某些警告。
  •   
  • ‘4’表示将以下文本视为包装在隐式extern“ C”块中。
  •   

答案 1 :(得分:0)

行号信息。

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