`
dyx1024
  • 浏览: 114572 次
  • 性别: Icon_minigender_1
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

C核心技术手册(十一)

 
阅读更多

1.1 C编译器如何工作

一旦你使用一个文本编辑器写了一个C源文件,你可能会调用一个C编译器将它翻译成机器码,编译器运转在一个包含有源文件和所有通过#include指示符引用进来的头文件的翻译单元中,如果编译器在翻译单元中没有发现错误,它将生成含有机器码的目标文件,目标文件常使用后缀.o或者.obj命名,另外,编译器可能也会生成一个汇编程序列表。

目标文件也叫做模块,一个库,例如C标准库,包含已经编译的、可以立即使用的标准函数模块。

编译器翻译C代码中的每一个翻译单元,每个包含任何头文件的源文件将生成一个独立的目标文件,然后编译器调用连接器,它会将目标文件、使用到的库函数合并成一个可执行程序,Figure 1-1描绘了由几个源文件和库经过编译、连接产生可执行文件的过程,可执行文件也包括目标操作系统加载它时所需要的信息。

C编译连接过程

1.7.1 C编译器翻译阶段

编译过程涉及8个逻辑阶段,可能编译器会将有些阶段合并,但结果是一样的,这些阶段是:

1. 从源文件中读出字符,如果必要,将转换为源字符集中的字符。行尾指示符与换行符不同,将会被替换,同样的,任何三字母词将被替换为等价的单字符.(但两字母词不会被替换为等价的单字符。)

2. 当一个反斜杠后面紧跟一个换行符时,预处理器将会删除这两个字符;如果仅为一个换行符,将结束一个预处理指示,这个阶段允许你在行尾放置一个反斜杠来继续下一行,例如宏定义中常使用。

:每一个非空文件,结尾必须有一个换行符

3. 源文件被分解为预处理记号和空白字符序列,每个注释会被当做一个空格处理。

4. 预处理完成,并做宏替换。

:阶段一到阶段四应用于任何能过#includle指示符添加的文件,一旦编译器实现了预处理指示,它将会从源码的副本中删除。

5. 字符常量和字符串的中字符和序列将会被转换为执行时字符集中等价的字符。

6. 邻近的字符串被连接成一个单独的串。

7. 真正的编译开始执行,编译器分析符号序列,并生成相应的机器码。

8. 连接器解决涉及到的外部对象和函数,生成可执行程序,如果一个模块引用的外部对象或函数没有在任何翻译单元中定义,连接器将从标准库或其他的专用库中找出它们,外部对象和函数在一个程序中不能定义多次。

大多数编译器中,预处理器是一个独立的程序,或者编译器提供配置选项来仅做预处理(阶段一到阶段四为预编译处理序列),这种设置允许你验证你的预处理程序是否有预期的功能。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics