Gcc 编译期间,include和header在哪里?

Gcc 编译期间,include和header在哪里?,gcc,compilation,Gcc,Compilation,我知道在预处理过程中,include和header将被复制到源文件中 我使用gcc编译文件 源文件(.c文件): 我的问题是: 在汇编文件中,源代码中添加的include stdio.h在哪里 在编译过程中,include和header的作用是什么?它们如何影响编译过程 提前谢谢 > P>头文件在C和C++中为编译器提供信息 它需要,以便解析您在其中创建的源文件 #包括它们。您可以将它们包含在源文件中 使编译器能够这样做。解析源代码 文件,以及所有#包括-ed头文件、编译器 能够生成能够 在可执

我知道在预处理过程中,include和header将被复制到源文件中

我使用gcc编译文件

源文件(.c文件):

我的问题是:

  • 在汇编文件中,源代码中添加的include stdio.h在哪里

  • 在编译过程中,include和header的作用是什么?它们如何影响编译过程


  • 提前谢谢

    > P>头文件在C和C++中为编译器提供信息 它需要,以便解析您在其中创建的源文件
    #包括它们。您可以将它们包含在源文件中
    使编译器能够这样做。解析源代码
    文件,以及所有
    #包括
    -ed头文件、编译器
    能够生成能够
    在可执行文件中与其他文件链接在一起。那个链接
    这是你的工作

    这对所有人来说都是不必要的 使编译器能够分析源代码的信息 要以任何形式复制到对象文件中的文件。一旦 已达到解析的目的,绝大多数 它通常没有进一步的用途。食谱能让你做一道菜。什么时候 你已经做了这道菜,你不指望能在里面找到菜谱

    如果生成并检查编译器生成的汇编代码 从某个输入源文件生成,您正在查看的是 对象文件的汇编语言翻译 编译器将从相同的输入生成。任何信息 是不必要的,并且在目标代码中不存在也是不必要的 并且在汇编代码中不存在

    典型头文件中的许多信息定义, 在代码中,软件设施的编程接口,用于编写您自己的代码 将使用,但已在您自己的对象所在的某个外部库中编译 代码将需要与链接。此信息使 编译器生成的目标代码可以与之链接 以预期和正确的方式访问外部库

    例如,在程序集列表中,可以看到程序正在初始化寄存器 要调用
    printf
    ,如您所知,这是一个标准的C函数,已实现 在程序将链接到的C运行时库中, 其接口由
    中的函数声明指定,其中包括
    。
    编译器只需验证设置
    printf
    以这种方式调用符合
    printf
    期望的调用过程 在C运行时库中。在对象代码中,
    printf
    调用 完全按照您在部件中看到的方式进行设置,
    一旦设置完成,就是浪费材料

    你可能会从中得到进一步的启发

    #include <stdio.h>
    
    int main(){
        printf("Hello World!!!");
        return 0;
    }
    
    # 1 "test.c"
    # 1 "<built-in>"
    # 1 "<command-line>"
    # 1 "/usr/include/stdc-predef.h" 1 3 4
    # 1 "<command-line>" 2
    # 1 "test.c"
    # 1 "/usr/include/stdio.h" 1 3 4
    # 27 "/usr/include/stdio.h" 3 4
    # 1 "/usr/include/features.h" 1 3 4
    # 367 "/usr/include/features.h" 3 4
    # 1 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 1 3 4
    # 410 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 3 4
    # 1 "/usr/include/x86_64-linux-gnu/bits/wordsize.h" 1 3 4
    # 411 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 2 3 4
    # 368 "/usr/include/features.h" 2 3 4
    # 391 "/usr/include/features.h" 3 4
    # 1 "/usr/include/x86_64-linux-gnu/gnu/stubs.h" 1 3 4
    # 10 "/usr/include/x86_64-linux-gnu/gnu/stubs.h" 3 4
    # 1 "/usr/include/x86_64-linux-gnu/gnu/stubs-64.h" 1 3 4
    # 11 "/usr/include/x86_64-linux-gnu/gnu/stubs.h" 2 3 4
    # 392 "/usr/include/features.h" 2 3 4
    # 28 "/usr/include/stdio.h" 2 3 4
    .......
    
        .file   "test.c"
        .section    .rodata
    .LC0:
        .string "Hello World!!!"
        .text
        .globl  main
        .type   main, @function
    main:
    .LFB0:
        .cfi_startproc
        pushq   %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset 6, -16
        movq    %rsp, %rbp
        .cfi_def_cfa_register 6
        movl    $.LC0, %edi
        movl    $0, %eax
        call    printf
        movl    $0, %eax
        popq    %rbp
        .cfi_def_cfa 7, 8
        ret
        .cfi_endproc
    .LFE0:
        .size   main, .-main
        .ident  "GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609"
        .section    .note.GNU-stack,"",@progbits