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

时间:2014-08-05 11:31:52

标签: c gcc file-extension

我正在浏览GCC手册页,我找到了以下内容:

 file.i
           C source code that should not be preprocessed.

我知道运行gcc -E foo.c会在预处理后停止编译器; 但创建.i文件的真实世界应用是什么。

还有一种方法可以生成除.i以外的gcc foo.c -E > foo.i个文件吗?

2 个答案:

答案 0 :(得分:6)

.i文件也称为" Pure C文件"。在预处理阶段

  1. 将包含页眉文件。

  2. 宏将被替换。

  3. 评论已删除。

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

  5. 生成.i文件的命令是 -

    gcc -E foo.c -o foo.i
    

答案 1 :(得分:1)

一个file.i文件是:

  

不应预处理的C源代码。

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

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

  1. 包括所有头文件
  2. 替换为宏
  3. 并删除了评论

...就像他的答案中的stated by @Sathish。您还会注意到gcc添加了很多特殊的“注释”,这些注释以#字符开头,例如:

# 1 "main.c"  
# 1 "<built-in>"  
# 1 "<command-line>"  
# 1 "/usr/include/stdc-predef.h" 1 3 4  
# 1 "<command-line>" 2  
# 1 "main.c"  
# 44 "main.c"  
# 1 "/usr/include/stdio.h" 1 3 4  
# 27 "/usr/include/stdio.h" 3 4  
# 1 "/usr/include/features.h" 1 3 4  
# 374 "/usr/include/features.h" 3 4  
# 1 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 1 3 4  

请注意一个简单的程序,例如:

#include <stdio.h>

int main()
{
    printf("hello world\n");

    return 0;
}

编译与此:

gcc -Wall -std=c99 -O0 -save-temps=obj main.c -o ./bin/main

将产生一个长约682行的main.i文件,上面显示的main()函数恰好在最后。

如何生成所有中间文件,包括.i文件:

我的首选是生成所有个中间文件(.i.o.s,而不是仅使用{{ 1}}),一次全部放在项目的本地.i文件夹中,如下所示:

-E

现在在“ foo / bin”目录中具有以下内容:

bin

使用以下程序当然运行程序:

mkdir bin
gcc -save-temps=obj foo.c -o ./bin/foo