C 我们在哪里使用.i文件以及如何生成它们?

C 我们在哪里使用.i文件以及如何生成它们?,c,gcc,file-extension,C,Gcc,File Extension,在浏览GCC手册页时,我发现以下行: file.i C source code that should not be preprocessed. 我知道运行gcc-efoo.c会在预处理后停止编译器; 但是创建.i文件的实际应用程序是什么呢 还有一种方法可以生成.i文件,而不是gcc foo.c-E>foo.i?该.i文件也称为“纯c文件”。在预处理阶段 将包括头文件 宏将被替换 注释将被删除 用于条件编译。 如果您查看.i文件,您可以看到以下内容 生成.i文件的命令无

在浏览GCC手册页时,我发现以下行:

 file.i
           C source code that should not be preprocessed.
我知道运行
gcc-efoo.c
会在预处理后停止编译器; 但是创建
.i
文件的实际应用程序是什么呢


还有一种方法可以生成
.i
文件,而不是
gcc foo.c-E>foo.i

.i
文件也称为“纯c文件”。在预处理阶段

  • 将包括头文件

  • 宏将被替换

  • 注释将被删除

  • 用于条件编译。 如果您查看
    .i
    文件,您可以看到以下内容

  • 生成
    .i
    文件的命令无效-

    gcc -E foo.c -o foo.i
    

    文件.i
    文件是:

    不应预处理的C源代码

    来源:
    mangcc
    然后搜索“
    \.i

    详细步骤:
    man gcc
    ,然后按/键进行搜索,然后键入
    \.i
    ,然后按Enter键,然后反复按n键直到找到它

    这意味着
    .i
    文件是预处理的源代码,因此它已经包含:

  • 包括所有头文件
  • 宏被替换
  • 和删除的评论
  • …就像他的回答一样。您还将注意到gcc添加的大量特殊“注释”,现在以
    #
    字符开头,例如:

    将生成一个约682行长的
    main.i
    文件,上面显示的
    main()
    函数就在最末尾

    如何生成所有中间文件,包括
    .i
    文件: 我的首选是在项目的本地
    bin
    文件夹中一次生成所有中间文件(
    .i
    .o
    .s
    ),而不仅仅是使用
    -E
    )生成
    .i
    文件,如下所示:

    mkdir bin
    gcc -save-temps=obj foo.c -o ./bin/foo
    
    现在,“foo/bin”目录中有以下内容:

    运行程序时,当然要使用:

    ./bin/foo
    
    关于“对象文件”和“可执行文件”的说明 请注意,最终输出,即
    foo
    可执行文件,被称为“编译的二进制程序”、“程序”(组合的)“目标文件”、“可执行文件”、“二进制文件”,或只是“机器代码”或“一和零”(10101010)。它是一个对象文件格式的对象文件,链接器将单个“*.o”对象文件合并成一个文件来创建它。链接器将所有“*.o”对象文件合并为一个文件,以使最终的
    foo
    可执行或组合对象文件

    GNU链接器(
    ld
    )手册说明如下。请参阅“3.1基本链接器脚本概念”一节(添加了重点,以及方括号中的内容
    []
    ):

    3.1基本链接器脚本概念

    为了描述链接器脚本语言,我们需要定义一些基本概念和词汇表

    链接器将输入文件[单个*.o对象文件]组合成一个单一输出文件。输出文件和每个输入文件都采用称为对象文件格式的特殊数据格式。每个文件称为对象文件。输出文件通常称为可执行文件,但出于我们的目的,我们也将其称为对象文件。除其他外,每个对象文件都有一个节列表。我们有时将输入文件中的一个部分称为输入部分;类似地,输出文件中的节也是输出节

    更多信息。在对象文件上,您还可以在此处看到我的其他两个答案:


  • 另一种方法是
    gcc--save temps-o foo foo.c
    一种实际用途是报告编译器错误。您发送触发bug的
    .i
    文件,以便没有您的标题的人可以复制该文件。
    gcc -Wall -std=c99 -O0 -save-temps=obj main.c -o ./bin/main
    
    mkdir bin
    gcc -save-temps=obj foo.c -o ./bin/foo
    
    foo     # compiled binary program (AKA: combined "object file", 
            # "executable", "binary", "program", or "machine code")
    foo.i   # intermediate, preprocessed C file  
    foo.o   # individual object file  
    foo.s   # assembly file
    
    ./bin/foo