C语言——程序实现过程

C语言——程序实现过程
一段代码要实现,会经过编译,汇编,链接,变成可执行程序,由我们用户使用 。程序的执行过程中有两个环境存在,一个是翻译程序环境,一个是执行代码环境,两个环境的不同就在于,先将代码翻译成我们的二进制文件供计算机阅读,然后计算机根据翻译的内容,执行相应的操作 。
程序的编译
程序的编译分为几个阶段,总结一下,就是将C代码转换成汇编代码,然后会进行代码的分析,就像语法分析,词法分析,语义分析,符号分析,而就是这几种分析,当我们编写程序的时候,遇见语法错误提示,便是编译阶段出了问题,在编译过程中,我们会将代码中注释部分去除,以便机器阅读效率更高 。
这里要特别了解一下**#在编译阶段,#定义的字符的值**会直接在代码中进行替换,然后定义的这行代码会被去除,使得代码简洁 。
而#可不止这一个功能,他不但可以定义字符,还可以用于定义宏,在计算结构体空间大小时,我们用到了一个函数这个函数在库函数中就是由宏定义的 。
#define OFFSETOF(struct,struct member)&((struct*)0)-struct member
宏是一种由#定义的,可以使用函数的功能,他在编译阶段会被识别然后进行替换 。
程序的汇编
进行完程序的编译就是程序的汇编,汇编的主要功能就是把汇编指令变成二进制指令,供机器识别 。
在这里我们可以打开vs编译器查看下面代码的反汇编 。
【C语言——程序实现过程】#includeint Add(int x,int y){int z=x+y;return z;}int main(){int a=1;int b=2;int ret=0;ret=Add(a,b);printf("%d",ret);return 0;}
打开反汇编方法
根据这个步骤,我们可以查看到该段代码的反汇编代码 。
可以发现,其中的一些还是可以识别的代码,这就是在汇编时,我们写的代码会转换成的二进制指令,供计算机阅读形成相应的符号表 。
程序的链接
在我们经常出现的错误未找到定义的函数时,就是程序的链接出现了错误,俗称链接错误,在链接时,程序会合并段表,主要会发生符号表定义和重定位 。经过链接才会生成可执行文件,也就是产生*.exe文件 。存在我们的Debug文件夹中 。
#的大用处
在简述程序的实现过程就免不了会看见#,这个符号的用处不光是在头文件和有关系,还跟打印有关,当我们在屏幕上打印东西的时候不可避免是会使用函数,在使用该函数打印字符串时,两个相邻被引用的字符串可以相互连接 。
#includeint main(){printf("hello" "world");return 0;}
可见当我们隔开字符时,字符打印时会自动连接,而我们的#是如何使用的 。
在我们打印个人信息时,经常会需要多行代码分开打印,而#可以代替变量的存在,减少代码冗余 。
#include#define PRINT(value,format) printf(#value"的值为"format"\n",value)int main(){int a = 1;PRINT(a, "%d");float b = 2.0f;PRINT(b, "%lf");return 0;}
这个宏既可以打印整型也可以打印浮点型,就是利用的#可以将后面跟随的值变成字符串,所以在打印时也可以输出,因为字符串和字符串之间可以相互连接 。
##(双#号)
这个符号的作用有点奇葩!!!
是将左右两边的字符串相结合,然后变成一个新的字符串,但前提是这个字符串被定义,否则会被判定不合法!
#include#define PACKBAG(num,value) num##valueint main(){int cat = 10;int mouse = 10;int catmouse = 20;printf("%d",PACKBAG(cat,mouse));return 0;}