【问题标题】:What do the lines starting with # symbol in g++ -E generated translation unit [duplicate]g++ -E生成的翻译单元中以#符号开头的行是什么[重复]
【发布时间】:2019-05-13 19:44:13
【问题描述】:

我试图检查为一个简单的 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. 是否有我应该阅读的文件,或者我必须获得任何特定主题的知识才能理解此文件?

【问题讨论】:

  • 以#开头的行是预处理指令,如#include#ifdef
  • “有什么我应该阅读的文件”我会以en.wikipedia.org/wiki/C_preprocessor开始
  • @Slava,翻译单元是在预处理后生成的,所以这些不是预处理器指令。

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


【解决方案1】:

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

-E

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

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

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

# linenum filename flags

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

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

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

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

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

【讨论】:

    【解决方案2】:

    行号信息。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-09
      • 2015-11-02
      • 2021-03-30
      • 2020-09-22
      • 1970-01-01
      • 2012-07-05
      • 2016-09-15
      • 2013-05-12
      相关资源
      最近更新 更多