预处理 该部分主要包括:宏 条件编译 文件包含 和一些其他指令四部分
- 1.宏:宏的替换:1、在调用宏时首先对其参数检查,如果参数又包含#define定义的符号,则它们首先被替换 2、替换文本会被插入到程序中原本文本的地方,宏名会被参数所替换 3、最后再扫描文本,如果还有#define定义的符号,则重复上面操作。
- 宏与函数的区别1、每次使用时,宏代码都被插入到程序中,除了非常小的宏外,程序的代码都会大幅提升。而函数代码只出现同一个地方。 2、宏的执行速度更快,而函数在调用和返回时有额外的开销。 3、宏的求值可能会产生副作用。函数只在调用时求值一次,将值传递给函数。 4、宏与类型无关,只要对参数的操作是合法的,它可以使用任何类型参数。函数参数与类型有关,形参和实参类型必须一致。 5、宏替换实在编译期间进行的,所以不能调试。函数调用实在执行期间,可以调试。
- 2.条件编译
作用:条件编译的功能使我们可以按照不同的条件去编译不同的程序部分,因而产生不同的目标代码文件
第一种条件编译方式:#ifdef 标识符 程序段1 else 程序段2 #endif 它的功能是如果标识符已经被#define命令定义过则程序段1参与编译否则程序段2参与编译,这种方式与if else语句用法相同
第二种条件编译方式:#ifndef 标识符 程序段1 else 程序段2 #endif 如果标识符未被#define定义,则程序段1参与编译,否则程序段2参与编译
第三种条件编译方式:#if 常量表达式 程序段1 #else 程序段2 #endif 如果常量表达式的值为真则程序段1参与编译,否则程序段2从那与编译
- 3.文件包含:在预编译处理阶段,于处理器发现#include指令之后,会将文件的内容
包含到当前文件进行编译。1、#include<filename>采用<>,预处理到系统规定的路径中去获得这个文件,找到文件内容后用文件内容替换该语句。 2、#include“filename”,“”标识预处理先在当前目录中查过这个文件,若找不到再按系统指定的路径信息搜索路径信息搜索其他目录,找到文件后用文件内容替换该语句。
4.其他指令:1、#error 生成编译错误提示信息,并停止编译。 2、#ine改变当前行数
或文件名称 3、#pragma 这个指令比较复杂,它的作用是设定编译器的状态或者指示编译器完成一些特定动作(#pragma message,#pragma code_seg,#pragma once,#pragma pack……)。 4、“#”把语言符号转化为字符串 5、“##”把两个语言符号组合成单个语言符号
编译:1、语法分析 2、词法分析 3、语义分析 4、符号汇总 5、文本语言转换成汇编语言
汇编:1.生成目标文件(Windows下生成.obj Linux下生成.o)2、形成符号表3,汇编指令转换成二进制命令
链接:1、合并段表 2、符号表的合并与符号表重定位 3、Windows下生成可执行程序.exe文件。 Linux下生成 ./a.out文件