绪论
书接上回,在上章我们学习完了文件的操作这样就能方便我们去保存我们所写代码的数据(学生信息管理系统),而本章于上一章并没有直接的关联,本章将讲的是程序在运行时会经历那些步骤(编译、预处理,链接等详细的了解C语言程序运行的过程)
话不多说安全带系好,发车啦(建议电脑观看)。
思维导图:
要XMind思维导图的话可以私信哈
目录
1.程序的翻译环境和执行环境
1.1翻译环境
1.1.1编译
1.1.1.1预编译(预处理,并生成.i为后缀的文件)
1.1.1.2编译(并生成.s为后缀的文件)
1.1.1.3汇编
1.1.2链接
1.2运行环境
2.预处理详解
2.1预定义符号
2.2#define
2.2.2#define定义标识符
2.2.2#define定义宏
2.2.3#define 替换的规则
2.3 #和##
2.3.1 #
2.3.2 ##
2.3.3 带有副作用的宏参数
2.3.4宏和函数的对比
2.3.5命名约定
2.4#undef
2.5命令行定义
2.6条件编译
2.7文件包含
2.7.1文件包含的方式
2.7.2文件的嵌套包含
1.程序的翻译环境和执行环境
在标准C语言语法(ANSI C)下有着两种不同的环境:翻译环境和执行环境
1.1翻译环境
知识点:
在翻译环境下是将源代码(.c)转换成机械指令(二进制指令)(可执行程序(.exe)),源代码就是我们所写的一个个语句(在vs2019环境下vs2019(集成开发环境是有着多个环境的集合)就充当了这个编译环境)
细节:
1.1.1编译
将每个源文件(.c)通过编译产生目标文件(.obj),最后通过链接器把链接库和目标文件统一的装在一起生成可执行程序(.exe)
具体如下展示:
1.1.1.1预编译(预处理,并生成.i为后缀的文件)
将预处理指令相关的操作(文本的替换)都会在此时执行(如#define、#include、#pragma都属于预处理指令)
#include头文件的包含、#define定义符号的替换、注释的删除
1.1.1.2编译(并生成.s为后缀的文件)
把C语言代码翻译成汇编代码(进行语法、词法、语义分析、符号汇总:汇总一些全局变量和函数)
1.1.1.3汇编
把汇编指令转换成二进制指令
形成符号表(对应着符号汇总的符号生成类似于表(有符号和对应的地址)),而这符号表最终也会传递到链接处起作用
1.1.2链接
合并段表(在.o目标文件中他们是分段的,所以在链接时就会把这些对应功能的段进行合并,elf类型的)
符号表的合并和重定位 (将不同源文件的符号表合并,每个源文件都会生成对应的符号表,最终合并成一个可执行程序,并且将外部声明的符号重定位),而此处的重定位假如没有对应成功的话那将报链接错误(所以说当报错链接错误时就表示这可能是你的函数名写错了导致他们没有定位到)
上述的都是大概的内容,具体的可以通过学习《程序员的自我修养》这本书来深入了解。
1.2运行环境
知识点:
运行环境其实就是程序执行过程具体如下:
程序载入到内存中
程序执行(从main函数开始)
开始执行代码,这个时候运行栈帧空间/static(静态区空间),存储函数的局部变量和返回的地址
结束,分正常结束,意外终止(出错了链接型,和编译型编译型(语法、词法、语义有错误))