C代码编译

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

       C代码写好后,第一道工序是预处理。预处理是由预处理器解释执行,预处理器读入源代码,根据预处理指令对其进行修改,然后将修改过的源码交给编译器。在预处理中,解决以#开头的宏定义、头文件及注释。用宏定义中的数值替换代码中使用宏定义的宏名称,将头文件中的内容复制到该代码中,将代码中的注释用空格代替,这就形成了纯C代码。预处理中做一些词法规则检查,比如宏定义中的宏名称不能出现奇怪符号,否则就会报错中断。在预处理中不做语法检查,而#include<stdio.h>中包含的只是一些库函数的声明,在源代码中使用的如printf的函数的声明由其提供。几个函数写在不同的文件中,若该文件中只是声明了某函数然后进行使用,由于在编译时候是按照文件编译的,在链接的时候才对符号进行重定位,有这么一种情况就是在该文件中声明且使用,但是没有文件为其提供定义,则会在链接过程中才会报出错误。linux中的gcc可以逐步的对C代码的翻译过程进行调试,依次生成.i纯C代码,.s汇编代码,和.o机器指令。预处理的其参数是-E ,若编写程序hello.c,则该命令为gcc  -E  hello.c,并将会将预处理后的结果打印出来。 

        下一道工序是编译,形成的是汇编代码,编译过程有词法分析,语法分析,语义分析,符号汇总四块构成。汇编过程中会形成语法树,将一个复杂的表达式进行分解形成树状形式,然后再从底部向上逐步形成句句汇编代码,此时生成的还是我们可以看的懂得文本文档。linux文件下的可执行文件是elf文件格式,通过命令打开其首部就会发现有一些符号的定义,每隔编译后形成的.o文件中汇集了该文件中的符号,为了在链接过程中进行符号重定位而提供的资料。 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文件,分别经过编译后,需要将其链接成为一个整体。还有预处理中的头文件只有声明没有定义,链接中会将那些函数的实现机器指令整合到该文件中,形成可执行文件。Linuxgcc参数是-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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值