gpt4 book ai didi

c - 包含头文件时到底发生了什么?

转载 作者:太空狗 更新时间:2023-10-29 15:11:15 25 4
gpt4 key购买 nike

我有两个疑惑:

  1. 头文件实际上包含什么?所有函数定义还是原型(prototype)声明?
  2. 当我包含一个头文件时会发生什么?头文件的所有内容都附加到我的代码中了吗?还是把头文件的具体(或全部)内容加载到内存中,按照我的代码调用函数?

最佳答案

C 和 C++ 是语言,广泛使用称为函数转发 的功能。这意味着,您可以说,例如:

void f(int i); /* note the semicolon */

这意味着:“我保证,稍后有人会在源代码的某个地方定义函数 f 的实际作用”。在这样的forward之后,你可以使用这个函数,因为它确实存在,编译器会要求有人在后面真正定义这个函数(如果没有定义,编译将失败)。这个forward也叫header,因为它实际上是一个函数定义的header:

void f(int i) /* Header */
/* Body */
{
/* ... */
}

头文件是一个文件,其中主要包含此类转发。您可以使用头文件访问在其他地方定义的函数(例如在不同的编译单元或外部库中),然后附加所需的目标文件或库以提供这些头文件的实现。除了函数转发之外,在头文件中您还可以找到结构定义、常量或其他项,这些是正确使用已定义函数所必需的。

编译器如何将您的转发与 .c 文件中的实际实现相匹配?好吧,很简单 - 通过 header 。它会尝试找到与您之前声明的 header 完全匹配的函数定义(实现)。

如果您使用#include 头文件,编译器(特别是预处理器)会将头文件的全部内容复制到您放置#include 的位置.这一切都很神奇,没有更多的事情发生。

在运行时,头文件根本不重要,因为你的可执行文件只包含可执行代码。编译器要么加载库中所有可用的函数(由头文件访问),要么(最有可能的情况是,如果打开了优化)仅选择您在代码中实际使用的这些函数。

有趣的是,只有当有人实际使用该函数时,编译器才需要函数定义(实现)。否则,前向被忽略。尝试:

void f(int i);

int main(int argc, char ** argv)
{
/* Do not use f here */

return 0;
}

关于c - 包含头文件时到底发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24483848/

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