C头文件的实现?

saa*_*aad 4 c implementation header system file

我是学C语言,并通过一些头文件在Linux目录被偷看/usr/includestdio.h,stdlib.h等真正困扰着我的是我看到的所有功能与定义extern的关键字,这意味着它们只能被没有任何定义,例如声明:

extern FILE *fopen (__const char *__restrict __filename,
                    __const char *__restrict __modes) __wur;
Run Code Online (Sandbox Code Playgroud)

每个其他头文件中的每个其他函数也是如此.我的问题是,如果他们只被宣布在他们的实施的哪里?他们必须在某个地方实施吗?

Chr*_*rle 8

这些被称为函数原型.它们告诉编译器该函数存在,但不是(尚).编译器使用它来确保你正确地调用函数,但就是这样.

编译完成后,将调用链接器.这就是魔术发生的地方.链接器确定哪个库具有该函数的实际实现.在这种情况下,它可能会出现在标准库中(在某些系统上称为libc),它会被自动拉入.链接器会执行其操作,然后您对该函数的调用将由库处理.

如果原型存在,但无法找到实现,则会出现链接器错误(类似于"未定义符号"的行).如果缺少原型,代码将编译,但您可能会收到警告(感谢Jim Balter提供有关此信息的信息).


Joh*_*ode 5

头文件只定义标准库函数的接口,而不定义实现;它们(通常)不包含任何可执行代码。

它取决于编译器和平台,但通常标准库函数已被编译并收集到二进制文件中,您的代码将链接到该二进制文件以生成可执行文件。

如果您在使用 gcc 的 Linux 系统上,您可以在/usr/lib. libc.a通常包含大量 C 标准库函数(stdio、stdlib、string 等)。数学函数单独存储在libm.a. 一般情况下,gcc会/usr/lib/libc.a自动链接,所以你不用担心。如果需要使用数学库函数,则需要添加-lm到命令行以链接数学库。

请注意,大多数实现并不提供库函数本身的源代码;您得到的只是预编译的二进制文件。


Cha*_*had 1

文件.h包含声明,定义保存在某个目标文件中的某个位置更多信息可以在这里找到。