包含的文件,全部或全部?

Mic*_*ams 15 c microcontroller microchip

我已经编写了一段时间的代码,但我不是经典的计算机科学培训,所以如果这个问题很荒谬,请放轻松我.

我一直试图找到一个确定答案的东西是,如果我在C中包含一个文件,我是否可以获得链接文件的整个内容,或者只是我使用的部分?如果它有10个函数,我只使用其中的1个函数,其他9个函数的代码是否包含在我的可执行文件中?这对我来说尤其重要,因为我正在研究微控制器并且内存非常宝贵.

感谢您对此问题的任何帮助.

AnT*_*AnT 18

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

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

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

第四,如果您的头文件是包含函数(或对象)定义的某种不寻常的类型,那么请参阅上面的"firstly"和"secondly".编译器本身一次只能看到一个转换单元,因此编译器的典型策略是完全丢弃具有内部链接(即static对象和函数)的未使用实体,并使所有实体保持外部链接.具有外部链接的实体不能被编译器正确丢弃,因为在某些其他翻译单元中可能需要它们.

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


nne*_*neo 9

如果您#include是C语言中的文件,则该文件的全部内容将添加到源文件中并由编译器进行编译.但是,头文件通常只有函数声明而没有定义(所以没有编译实际代码).

的连接体,而另一方面,需要来自所有库中的所有的功能和编译的源代码,并将它们合并到最终的输出文件.此时,链接器将丢弃您未使用的任何功能.

所以,回答你的问题:只有你使用(并间接依赖)的函数将包含在你的最终程序文件中,这与你的文件无关#include.快乐的黑客!