C语言编译细节

来源:互联网 发布:矩阵二范数计算 编辑:程序博客网 时间:2024/05/21 10:11

   C语言的翻译分为编译,链接过程,编译过程又分为预处理,解析,汇编。

现在的编程软件都提供了很方便的翻译环境,将翻译链接综合在一块,只通过简单的几个按键就能运行程序。将这个翻译过程理解,有助我们更深的了解计算机的运行机制,更好的运用其不同特性完成不同功能。

C代码写好后,第一道工序是预处理。预处理是由预处理器解释的,预处理器读入源代码,根据预处理指令对其进行修改,然后将修改过的源代码交给编译器。在预处理中,解决以#开头的宏定义和头文件及注释。将宏定义中的数值替换代码中使用宏定义的宏名称,将头文件中的内容复制到该代码中,将代码中的注释用空格代替,这就形成了纯C代码。

预处理中做一些词法规则检查,比如宏定义中的宏名称不能出现奇怪符号,否则就会报错中断。在预处理中不做语法检查,而#include<stdio.h>中包含的只是一些库函数的声明,在源代码中使用的如printf的函数的声明由其提供。如果是在写代码中,若是只声明了函数而未定义,在函数中使用了该函数,在该过程中是不会出现错误的。

linux中的gcc可以逐步的对C代码的翻译过程进行调试。

预处理的其参数是 -E ,若编写程序hello.c,则该命令为gcc  -E  hello.c,并将会将预处理后的结果打印出来,但不会形成文档形式(red hat版本)。

 

 

下一道工序是编译,形成的是汇编代码。在该过程中会进行语法检查,若是某函数声明过未定义且使用了,则会在该过程中被检查出来。汇编过程中会形成语法树,将一个复杂的表达式进行分解形成树状形式,然后再从底部向上逐步形成句句汇编代码,此时生成的还是我们可以看的懂得文本文档。

Liunx下编译的参数是-S,对hello.c编译gcc  -S  hello.c ,该命令会生成.s文档,用cat命令打开文档,便可以查看文档中的汇编代码。该命令是cat  hello.s

 

然后就是对汇编代码进行汇编,生成中间文档,在linux中文档后缀为.o,在VS中为.obj

汇编后生成的是二进制文档,这是机器所能识别的指令。

linux下用gcc,该命令参数是-c,用hello.c举例是gcc  -c  hello.s,执行完毕后形成hello.o文档,可用查看非文本文档的指令od打开该文档,命令是:od hello.o

 

然后便是链接了,在工程中,一个程序的编写会有好几个C文件,分别经过编译后,需要将其链接成为一个整体。还有预处理中的头文件只有声明没有定义,链接中会将那些函数的实现机器指令整合到该文件中,形成可执行文件。

Linux gcc参数是-o,命令是gcc hello.o -o hello,生成可执行文件hello。再同通过./hello运行该程序。

 

如果有几个.c文件需要链接到一块,例mian.chello.c的链接过程,hello.c中有print函数输出hello worldmain.c中引用该函数,先将两个函数生成.o文件,命令为gcc  -c  hello.c main.c生成中间文件hello.omain.o,然后进行链接生成可执行文件,gcc  hello.o  main.o  -o  hello,则生成可执行文件hello,通过./hello命令便可执行该程序。

0 0
原创粉丝点击