在C语言中包含头文件的作用

3
包含一个头文件,但在源文件中没有使用其中声明的任何函数会产生什么影响?它会影响堆栈大小等吗?
5个回答

6
这将不会产生任何影响,但会增加编译时间并使代码更难理解和维护。你应该只包含实际需要的头文件,并删除那些变得多余的头文件。

请问您能否解释一下为什么它会增加编译时间?是因为额外的预处理开销吗? - Zoso

6
那要看头文件中是否有定义或只是声明。此外,这完全取决于实现方式,因为ISO C标准没有规定在该层次上如何处理事情。它仅涵盖了在“C虚拟机”级别下的行为方式。但我将在此介绍最可能的情况。
例如,像int xyzzy;(或更糟糕的char big_honkin_thing [9999999];)这样的定义可能会占用对象文件中的空间,并且除非您有一个特别聪明的链接器,否则还会占用可执行文件中的空间。我说“可能”,因为这取决于实现方式。
初始化值更可能确保其存储在对象中而不是在运行时创建。但是,无论如何,您都可能会发现影响,如果它是在编译时创建,则会导致更大的对象/可执行文件,或者(轻微地)更慢的启动时间,因为需要初始化更多的内存。
例如,在头文件中添加char big [99999] = {'x'};会导致可执行文件的大小从18K增加到118K。
简单声明之类的typedef和extern本身不会在对象中分配空间。
此外,即使没有定义,编译时间也会增加,因为编译器必须处理该头文件。但是,它对运行时本身的速度或存储没有任何影响。

好观点;但是 char big_honkin_thing[9999999]; 可能在二进制文件中不占用空间(因为它没有被初始化)。 - cnicutar
1
@cnicutar,是的,会。静态存储期对象被初始化为全零。就像我说的,你可能有一个聪明的链接器,它意识到它没有使用并从可执行文件中删除它,但这也适用于显式初始化的内容。 - paxdiablo
@paxdiablo。我认为这与链接器检测到未使用的内容无关(顺便说一下,ld不会检测到任何东西)。这是关于.bss.data的区别。 - cnicutar
@cnicutar,抱歉,我改口了。有些编译器会聪明地在运行时分配零初始化的内容,而不是将其存储在目标文件中。我会更新答案,但这是一个实现问题,而不是C语言问题(而且,在任何情况下,这仍然是一种影响,尽管是时间上的影响,而不是空间上的影响)。 - paxdiablo
非常正确。问题是定义是否应该出现在头文件中。除了一些非常特殊的情况,我认为这是一个错误或至少是一个严重的代码异味。 - Daniel Rose

4

堆栈大小由您的链接器确定。您可能实际上是指生成的代码是否更大。

在翻译单元中包含一个声明从未被引用的头文件不会影响生成对象的大小。当然,它会减慢编译速度。


即使声明没有被引用,这是否会增加“翻译单元”的大小?显然,它不会影响最终的对象大小,正如您所提到的。 - Zoso

2

这将会增加编译时间,但据我所知,不应该有其他的变化。


0

如果头文件中没有任何影响源文件的内容,直接访问源文件比使用头文件访问源文件所需的时间更短。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接