编译四阶段:预处理、编译、汇编、链接
使用关键字define 定义 叫宏
#define PI 3.14 (宏定义)
在预处理结果 使用3.14替换所有出现PI的位置(宏展开)
注意:不要在宏后面加分号
#define PI 3.14
if(PI>3.0)
{
语句;
}
如果在宏后面加分号,例如:
#define PI 3.14;
if(PI>3.0)
PI就会被替换为3.14;
宏尽量大写和普通变量区分开
不带参数的宏
#define PI 3.14 (宏定义)
#define MY_STR "hello world"
#define N 100
宏的作用范围:是从定义出开始 到 当前文件结束 都有效
#undef可以结束宏的作用域
宏 没有作用域的限制 只有当前源文件 有效
带参数的宏(宏函数)
#define MY_MUL(a,b) a*b
cout << MY_MUL(10,20);//10*20
1、宏的参数不能有类型
#define MY_NUL(int a, int b) a*b //error
2、宏不能保证参数的完整性
#define MY_NUL(a,b) a*b
cout<<MY_NUL(10,20); //10*20
cout<<MY_MUL(10+10,20+20); //10 + 10*20 +20 == 230
MY_NUL(10 + 10, 20 + 20)的结果是230 而不是800
可以使用()的形式 让带参数的宏 具备一定完整性
#define MY_MUL(a, b) a*b
#define MY_NUL(a, b) ((a) * (b))
cout<< MY_MUL(10,20); //10*20
cout<< MY_MUL(10 +10, 20 + 20); //10 + 10*20 + 20 == 230
cout<< MY_MUL(10 + 10, 20 +20); //((10 + 10)) * ((20 + 20)) == 800
3、宏不能作为结构体 类的成员
4、案例
#define MY_MUL(a,b) a*b
#define MY_MUL2(a,b) ((a)*(b))
cout<< MY_MUL( MY_MUL2(10+10,20+20), MY_MUL(10+10, 20+20));//8220
先要替换MY_MUL2(10+10,20+20) * MY_MUL(10+10, 20+20)
(10+10)* (20+20)* 10+10*20+20