gpt4 book ai didi

c - 包含的文件,全部还是全部?

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

如果我在 C 中#include 一个文件,我是得到链接的文件的全部内容,还是只得到我使用的部分?

如果它有 10 个函数,而我只使用其中一个函数,那么其他九个函数的代码是否包含在我的可执行文件中?这对我来说尤其重要,因为我正在研究 microcontroller。内存是宝贵的。

最佳答案

首先,头文件不会被“链接进来”。 #include 基本上是一种文本复制粘贴功能。包含文件中的所有内容都由预处理器粘贴到最终翻译单元中,稍后将由编译器本身进行无缝处理。编译器本身对任何头文件或 #include 指令一无所知。

其次,这意味着如果在您的代码中您声明或定义了一些您不使用的函数或变量,那么它是通过#include 来自头文件还是被写入完全无关直接在源文件中。绝对没有区别。

第三,问题是:您包含的头文件中究竟包含什么?通常,头文件不会定义对象和函数,它们只是声明它们。 声明 不会产生任何代码,无论您是否使用函数。 声明 只是告诉编译器代码(从函数定义 生成)已经存在于别处。因此,只要我们讨论的是典型的头文件,#include 指令和头文件本身就不会影响最终代码大小。

第四,如果您的头文件属于包含函数(或对象)定义 的特殊类型,请参见上面的“首先”和“其次”。编译器本身一次只能看到一个翻译单元,因此,编译器本身的典型策略是完全丢弃未使用的具有内部链接的实体(即static对象和功能)并使所有实体都具有外部链接。具有外部链接的实体不能被编译器本身丢弃,因为它们可能在其他一些翻译单元中需要。

第五,在链接阶段 链接器 可以看到整个程序,因此可以丢弃未使用的对象和函数,如果它足够先进的话(如果你允许链接器去做)。同时,典型的普通链接器的包含排除精度仅限于单个目标文件。每个目标文件对于此类链接器都是原子的。这意味着如果您希望能够在每个函数的基础上排除未使用的函数,您可能必须采用“每个目标文件一个函数”策略,即每个 .c 编写一个且仅一个函数文件。当然,这只有在您编写自己的代码时才有可能。如果您要使用的某些第三方库不遵守此约定,那么您可能无法排除个别功能。

关于c - 包含的文件,全部还是全部?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35470450/

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