什么负责确保所有符号都已知/定义?

时间:2011-12-01 19:32:50

标签: c compiler-construction linker c-preprocessor

C 预处理器,编译器还是连接编辑器?

4 个答案:

答案 0 :(得分:3)

说实话,它是程序员。

答案 1 :(得分:0)

您正在寻找的答案是...... 编译器 它取决于。有时它是编译器,有时它是链接器,有时它会在程序加载之前发生。


preprocessor

  

处理源文件包含(#include),宏定义(#define)和条件包含(#if)的指令。
  ...
  预处理程序指令的语言与C 的语法无关,因此C预处理程序也可以独立用于处理其他类型的文本文件。

linker

  

获取编译器生成的一个或多个对象,并将它们组合成一个可执行程序   ......

     

计算机程序通常包括几个部分或模块;所有   这些部件/模块不需要包含在单个目标文件中,   在这种情况下,通过符号相互引用。通常情况下,   目标文件可以包含三种符号:

     
      
  • 定义的符号,允许其他模块调用,
  •   
  • 未定义的符号,用于调用定义了这些符号的其他模块,
  •   
  • 本地符号,在目标文件内部使用,以方便重定位。
  •   
     

当程序包含多个目标文件时,链接器会合并   将这些文件转换为统一的可执行程序,解析   符号随着它的进展。

在允许dynamic linking的环境中,有可能

  

可执行代码仍然包含未定义的符号,以及将为这些符号提供定义的对象或库列表。

答案 2 :(得分:0)

  • 对于具有内部链接或无链接的符号:编译器。
  • 对于具有外部链接的符号:链接器,“传统”链接器或运行时链接器。

请注意,动态/运行时链接器可以选择懒惰地执行其工作,仅在使用它们时解析符号(例如:第一次调用函数时)。

答案 3 :(得分:0)

程序员必须确保在某处定义所有内容。程序员有责任这样做。

如果发现任何遗漏,各种工具都会抱怨:

编译器会注意到某些缺失的东西,并且如果它能够意识到某些东西不在那里就会出错。

如果链接器无法修复某个库中不存在的引用,则链接器将会出错。

在运行时,有一个加载器将相关的共享库拉入进程的内存空间。加载程序是在程序运行任何代码之前修复符号的最后一件事,如果它找不到共享库/ dll,或者如果使用的库的接口,它将抛出错误在链接时,与可用库无法正确匹配。

这些工具都不负责确保所有内容都已定义。如果事情没有定义,它们就是注意到的东西,并且会抛出错误信息。