一、预编译(由符号 # 开头的一些命令)
C语言中主要有以下三种预编译处理指令:
1.#define和#undef命令
2.#include命令
3.#if…#endif和#if…#else…#endif命令
二、#define指令(用于宏定义,有带参数和不带参数两种类型)
1.不带参数的宏定义
定义格式:#define 符号常量(习惯上一般用大小表示) 替换文本(C语言允许范围内的)
注意点:
(1)如果主函数中有字符串和#define后的符号常量相同,不进行替换
(2)宏定义只是一种字符替换,不进行语法检查(编译阶段不报错,执行才报错)
(3)每条宏命令单独一行(宏命令最后无“;”)
(4)宏不可以被多次定义,但宏可以引用已经定义的宏
#include R 3.0
#define PI 3.14159
#define AREA PI*R*R
(5)宏定义只做字符替换,不分配存储空间(因此宏定义的常量值不能被修改)
(6)可以使用#undef取消宏定义(宏定义的作用范围为第一次定义位置开始到#undef命令结束)
注意使用#undef后,后续无法继续引用#define 符号常量
2.带参数的宏定义
定义格式:#define 宏名(形参列表) 宏体
#define SUM(a,b) a+b
注意:
(1)宏定义时宏名与后面的括号之间不能有空格
(2)在一个带参数的宏定义中,应该用带运算符的宏体和形参括起来
3、宏定义与函数的主要区别
宏定义 | 函数 |
程序运行时调用函数,系统分配临时存储空间,函数调用将占用程序执行时间 | 宏定义在编译时进行处理,编译阶段展开时不分配存储空间,只占用编译时间 |
函数调用时,先计算实参再代入形参 | 宏定义只进行对应字符替换 |
函数的实参、形参必须有定义类型,且定义类型必须一致 | 宏定义不存在类型问题(因为不需要多余的定义) |
函数调用不会使源程序变长 | 每一处宏调用都要插入宏体,因此宏展开时使源程序代码增加 |