概述
对一个源文件进行编译时 系统先要自动引用预处理程序对源程序中的预处理命令做相应的处理 处理后自动地进入源程序进行编译
它分为 宏定义 文件包含 条件编译
宏定义及其分类
不带参数的宏定义 字符串
一般形式 #define 标识符 字符串 用一个指定的标识符来表示一个字符串
字符串可以是常数、表达式、格式串等
宏定义的嵌套 可以直接引用已定义的宏名
如果要提前终止其作用域 可以使用#undef 标识符
带参数的宏定义
一般形式 #define 宏名 (参数表) 字符串 注意宏名和形参表之间不能有空格出现
带参数的宏定义与函数的区别在于:
1.函数的调用为形参分配内存空间,而宏的展开和参数置换等都在程序编译前进行,在展开式只是替换,并无内存空间的分配。
2.函数的形参与实参之间是值传递,而宏定义中参数的置换时预处理的替换过程中,并不存在所谓的参数的传递。
3.函数调用有返回值,宏定义没有返回值。
4.函数中,形参和实参的类型要一致。但宏并不存在类型问题,宏名无类型,参数无类型,展开时只是带入指定的字符串,宏定义时,字符串可以是任何类型的数据。
5.宏替换不占用程序的运行时间,只占用编译时间;而函数的调用要占用程序运行的时间。
并非任何情况下带参数的宏定义都可以等效于函数调用 因为其实现的原理存在本质的差异
文件包含
1.文件包含顺寻有讲究:后包含的文件可以使用先包含的文件的内容。
2.允许包含的嵌套:在一个被包含的文件中也可以包含其它文件。
3省略外部变量声明extern:应用文件包含可使一个文件中定义的外部变量(全局变量)被多个文件共同使用的,在其他文件中不需要对应用外部变量做extern声明。
条件编译