gpt4 book ai didi

C 头文件和编译/链接

转载 作者:太空狗 更新时间:2023-10-29 16:23:23 24 4
gpt4 key购买 nike

我知道头文件有各种函数、结构等的前向声明,这些在 .c 中使用。 “调用”#include 的文件, 正确的?据我了解,“三权分立”是这样发生的:

头文件:func.h

  • 包含函数的前向声明

    int func(int i);

C 源文件:func.c

  • 包含实际的函数定义

    #include "func.h"

    int func(int i) {
    return ++i ;
    }

C 源文件 source.c (“实际”程序):

#include <stdio.h>
#include "func.h"

int main(void) {
int res = func(3);
printf("%i", res);
}

我的问题是:看到 #include只是一个编译器指令,用于复制 .h 的内容在 #include 的文件中在,.c怎么办?文件知道如何实际执行功能?它得到的只是int func(int i); ,那么它如何实际执行该功能呢?它如何访问 func 的实际定义? ? header 是否包含某种“指针”,上面写着“这是我的定义,在那边!”?

它是如何工作的?

最佳答案

Uchia Itachi给出了答案。它是链接器

使用 GNU C 编译器 gcc 你可以编译一个像

这样的单文件程序
gcc hello.c -o hello # generating the executable hello

但是如示例中所述编译两个(或更多)文件程序,您必须执行以下操作:

gcc -c func.c # generates the object file func.o
gcc -c main.c # generates the object file main.o
gcc func.o main.o -o main # generates the executable main

每个目标文件都有外部符号(您可以将其视为公共(public)成员)。默认情况下,函数是外部的,而(全局)变量默认是内部的。您可以通过定义

来更改此行为
static int func(int i) { # static linkage
return ++i ;
}

/* global variable accessible from other modules (object files) */
extern int global_variable = 10;

当遇到对未在主模块中定义的函数的调用时,链接器会搜索作为定义被调用函数的模块的输入提供的所有目标文件(和库)。默认情况下,您可能有一些库链接到您的程序,这就是您可以使用 printf 的方式,它已经编译到一个库中。

如果您真的有兴趣,请尝试一些汇编编程。这些名称等同于汇编代码中的标签。

关于C 头文件和编译/链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18548157/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com