是 C 预处理器,编译器还是连接编辑器?
答案 0 :(得分:3)
说实话,它是程序员。
答案 1 :(得分:0)
您正在寻找的答案是...... 编译器 它取决于。有时它是编译器,有时它是链接器,有时它会在程序加载之前发生。
处理源文件包含(
#include
),宏定义(#define
)和条件包含(#if
)的指令。
...
预处理程序指令的语言与C 的语法无关,因此C预处理程序也可以独立用于处理其他类型的文本文件。
获取编译器生成的一个或多个对象,并将它们组合成一个可执行程序 ......
计算机程序通常包括几个部分或模块;所有 这些部件/模块不需要包含在单个目标文件中, 在这种情况下,通过符号相互引用。通常情况下, 目标文件可以包含三种符号:
- 定义的符号,允许其他模块调用,
- 未定义的符号,用于调用定义了这些符号的其他模块,
- 本地符号,在目标文件内部使用,以方便重定位。
当程序包含多个目标文件时,链接器会合并 将这些文件转换为统一的可执行程序,解析 符号随着它的进展。
在允许dynamic linking的环境中,有可能
可执行代码仍然包含未定义的符号,以及将为这些符号提供定义的对象或库列表。
答案 2 :(得分:0)
请注意,动态/运行时链接器可以选择懒惰地执行其工作,仅在使用它们时解析符号(例如:第一次调用函数时)。
答案 3 :(得分:0)
程序员必须确保在某处定义所有内容。程序员有责任这样做。
如果发现任何遗漏,各种工具都会抱怨:
编译器会注意到某些缺失的东西,并且如果它能够意识到某些东西不在那里就会出错。
如果链接器无法修复某个库中不存在的引用,则链接器将会出错。
在运行时,有一个加载器将相关的共享库拉入进程的内存空间。加载程序是在程序运行任何代码之前修复符号的最后一件事,如果它找不到共享库/ dll,或者如果使用的库的接口,它将抛出错误在链接时,与可用库无法正确匹配。
这些工具都不负责确保所有内容都已定义。如果事情没有定义,它们就是注意到的东西,并且会抛出错误信息。