C语言编译原理是什么?

如题所述

编译共分为四个阶段:预处理阶段、编译阶段、汇编阶段、链接阶段。
1、预处理阶段:
主要工作是将头文件插入到所写的代码中,生成扩展名为“.i”的文件替换原来的扩展名为“.c”的文件,但是原来的文件仍然保留,只是执行过程中的实际文件发生了改变。(这里所说的替换并不是指原来的文件被删除)
2、汇编阶段:
插入汇编语言程序,将代码翻译成汇编语言。编译器首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,编译器把代码翻译成汇编语言,同时将扩展名为“.i”的文件翻译成扩展名为“.s”的文件。
3、编译阶段:
将汇编语言翻译成机器语言指令,并将指令打包封存成可重定位目标程序的格式,将扩展名为“.s”的文件翻译成扩展名为“.o”的二进制文件。
4、链接阶段:
在示例代码中,改代码文件调用了标准库中printf函数。而printf函数的实际存储位置是一个单独编译的目标文件(编译的结果也是扩展名为“.o”的文件),所以此时主函数调用的时候,需要将该文件(即printf函数所在的编译文件)与hello
world文件整合到一起,此时链接器就可以大显神通了,将两个文件合并后生成一个可执行目标文件。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2020-04-20
1、char
*p="asdf";
则sizeof(p)=2;
是返回指针p占用字节数;即使你是先定义再赋值,char
*p;
p="asdfasdf";
sizeof(p)都是等于2;任何指针在turbo
c中都是2个字节,不是说“字符串中有'0\'占一个字节,字符类型指针占一个字节”。。楼上有的说sizeof(p)是求变量p或字符串长度,是错的,是求占用字节数,不是长度,长度是用函数strlen(p);
sizeof不是函数,是一种运算符。。例子:char
p[]="abc";则sizeof(p)=4;strlen(p)=3;
比较于char
p[10]="abc";
sizeof(p)=10;
strlen(p)=3。。。
但如果定义成:char
p[]="asdf";
则sizeof(p);就等于5了,数组名p虽然可以看做指针,但不完全跟指针一样,这就是例子了。。

2、编译器可以看作一个虚拟机器,可以有自己虚拟的内存,栈等。。编译系统就可以看作是物理电脑操作系统上虚拟机的运行系统。。所以不一定是物理地址,但跟物理地址有映射关系,至于为什么,怎么映射,我也不知道。。。

3、编译器是16位。。跟“loat
为4个字节
double
32个字符”??。。跟float
4字节32位没关系,那是编译器设定的,就是常说电脑是16位或32位操作系统一样,编译器16位就看作虚拟机器是16位运行系统。。

4、
我也不知道为什么,
(*p)(int,int);是int
(*p)(int,int);吧。。。
相似回答