c++ - 如何将头文件编译成可执行文件?

标签 c++ c binary include header-files

当您从 C 标准库或 C++ STL 中包含一个头文件(.h、.hpp、.hh、.hxx 扩展名)时(甚至包含 Microsoft 的大头文件,如 windows.h), 并且只使用其中有限数量的函数,整个文件变成二进制文件并复制到可执行文件,还是只是正在使用的特定相关函数变成二进制文件?

如果正在复制整个文件(这就是我认为实际发生的情况,因为 windows.h 具有宏定义以减少冗余;例如 WIN32_LEAN_AND_MEAN)-为什么会这样?为什么 #include 预处理器命令不只复制使用过的函数(以及这些函数在后台使用的其他函数)?是不是更划算?

如果只复制相关函数 - 为什么我们必须首先进行 header 包含?为什么我们不在需要时使用和编译大量函数,就像 PHP 等解释型语言中的情况(以及 Python 中的某些情况)。如果只是因为“C 和 C++ 更旧并且已经标准化”,为什么不在他们的新版本中这样做呢?或者至少现代编译器允许它(我们已经看到编译器为了现代开发人员而改变老化语言的情况)?

最佳答案

头文件只是告诉编译器外部函数和变量的类型,定义宏,类型等。什么都不会被复制。源文件中引用的任何函数和变量(称为外部符号)都将在链接器阶段链接进来。

如果您在程序中包含 stdio.h 并使用 printf,编译器会将 printf 添加为目标文件中的“未解析”符号,然后链接器将尝试在您明确指定的目标文件中查找名为 printf 的函数链接,或在配置为搜索的库中。

如附近所述,#include 文件和将该文件的内容复制到您的源文件之间并没有真正的区别。如果该包含文件包含函数或数据定义(不仅仅是声明),那么这些 DO 将成为目标文件的一部分。

关于c++ - 如何将头文件编译成可执行文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20019441/

相关文章:

c++ - 构建libssh时在qt和cmake错误上找不到libssh的功能

c++ - C++中通过remove方法自删除对象

python - FBX SDK - 从角色的 ENodeId 获取 FbxNode

c - 在单写入多读取系统中我们需要锁吗?

c++ - 为什么要插入一个? (问号)就在 map 条目之前?

c - 我合并两个链表的功能无法正常工作

ios - 如何通过代码获取 iOS 设备的 GPU 信息

c - 将二进制解析为十进制

binary - 进程间共享大二进制数据

c++ - 为什么 basic_ifstream 显示错误的结果?