【发布时间】:2013-11-10 01:12:23
【问题描述】:
#include 指令将导致在编译之前将头文件的内容放在源代码中:例如,如果我包含 stdio.h ,则预处理器会将 stdio.h 的所有内容放在源代码中然后编译不是吗?
所以让我们假设我只是在我的代码中使用 printf() 函数。所以在编译之后和链接之间肯定会发生一些事情,这将删除头文件中包含的所有函数实现,并且只在可执行文件的导入表中插入 printf() 函数实现,知道所有其他函数是用源码编译的。请你给我解释一下好吗?
【问题讨论】:
-
其他功能不是删了。如果您不调用函数,则不会生成引用它的代码,因此由于从未创建过链接而丢失了链接。这就像说“电话公司给我发了电话簿。我查找了我的朋友并打电话给他。当我收到电话账单时,我看到账单上只列出了我的朋友。谁删除了所有我没有打电话的电话号码?”
-
@RaymondChen,不完全是。链接时优化将在每个对象文件的基础上消除未使用的代码。至于你的例子,电话账单实际上可能包含所有家庭成员的记录。
-
@liuyu 这里的问题不是链接器清理。没有什么需要清理的,因为它从未被创建。
-
头文件中(通常)没有函数调用——只有函数(以及结构、常量等)的签名(返回类型、参数类型和函数名称)的声明。
-
@RaymondChen,您假设链接到共享库,其中可执行文件仅包含对函数实现的引用。但这个问题最好用静态链接来解释,即链接器如何处理在
<stdio.h>中声明但未在程序中调用的函数。