【问题标题】:what do the # numbers in *.i files represent [duplicate]*.i 文件中的 # 数字代表什么 [重复]
【发布时间】:2020-07-20 20:59:39
【问题描述】:

我想知道c程序的执行步骤。我得到了这个我无法理解的中间文件 屏幕截图中的这些数字代表什么以及它的具体作用。

# 1 "C:/Program Files (x86)/mingw-w64/i686-8.1.0-posix-dwarf-rt_v6-rev0/mingw32/i686-w64-mingw32/include/stdio.h" 1 3
# 9 "C:/Program Files (x86)/mingw-w64/i686-8.1.0-posix-dwarf-rt_v6-rev0/mingw32/i686-w64-mingw32/include/stdio.h" 3

take a look at ss

【问题讨论】:

  • 请将代码发布为formatted text,而不是图片。还要提供你用来生成这个文件的命令
  • 请不要显示文字图片。 Edit您的问题并将您想知道的文本复制粘贴到问题中,作为文本
  • 我认为,这些是用于将预处理 C 与原始源匹配的行号。使用嵌套包含它可能会变得相当复杂,但编译器可以使用它来打印更好的警告消息(例如原始定义是冲突的原型或其他东西。)
  • 什么是.i文件?
  • @peter:抱歉,我不知道这是怎么回事。有几十个合适的骗子:当我找到一台有可用接口的机器时,我会添加一些泥潭。

标签: c gcc assembly c-preprocessor


【解决方案1】:

.i 文件是 gcc -save-temps 输出预处理 C 的位置。 这是 C,不是汇编语言。您会在 .s 文件中找到 asm。


这些是用于匹配预处理 C 与原始源代码的行号。我不知道开头的数字与文件名后面的一两个数字是什么意思。如果您需要了解详细信息,您可能需要查看 GCC 内部,或者它可能已记录在某处。

使用嵌套包含可能会变得相当复杂,但编译器可以使用它来打印更好的警告消息(例如原始定义是冲突的原型或其他东西)。

GCC 在编译器通道中内置了 C 预处理器,所以我不确定它是否真的需要(或可以)读取 .i 中的这些“注释”元数据行;在正常操作中,主 C->asm 编译器传递知道它读取的所有内容的文件/行号,而无需将其序列化为这种文本格式并返回。

GCC 确实有读取预处理 C 作为输入的选项,特别是 -fpreprocessed,如果您要运行 gcc -c foo.i,默认情况下它是打开的。

向预处理器指示输入文件已被预处理。这会抑制宏扩展、三字符转换、转义换行符拼接和大多数指令的处理等事情。预处理器仍然可以识别并删除 cmets,因此您可以将使用 -C 预处理的文件毫无问题地传递给编译器。在这种模式下,集成的预处理器只不过是前端的分词器。

如果输入文件具有扩展名.i.ii.mi 之一,则-fpreprocessed 是隐式的。这些是 GCC 用于 -save-temps 创建的预处理文件的扩展。

所以这就是让 GCC 仍然删除那些以# 开头的行的原因,这些行类似于预处理器指令。 (如#define#include)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-16
    • 2014-12-25
    • 2019-03-11
    • 1970-01-01
    • 2013-11-02
    • 2012-10-13
    • 1970-01-01
    • 2013-06-04
    相关资源
    最近更新 更多