被定义为宏的标识符称为 宏名,在编译预处理时对所有出现的宏名,都用宏定义中出现的字符串取代换,这称为宏定义或者宏展开。(代换后,代换部分优先级不会受影响,不会优先计算)
宏定义分为:有参数和无参数
格式:
#define 宏名 宏字符串(可以是常量,变量,表达式)
例:
#define M 10
#defin M1 y*y+3*y
注意:
预处理指令经常写在主函数之前。
宏定义不是一个语句,后面不需要加分号
宏替换:源程序在编译之前,由预处理程序对我们写的源代码进行处理:会把源代码中所有出现 宏名 的地方一律用 宏字符串 去替换。
注意事项:
1)宏名习惯性大写
2)宏定义的时候用宏名替换一个字符串,宏展开的时候用字符串替换宏名,这只是一种简单的代换,预处理程序对它不做任何的检查,如有错误,只能在编译已被宏展开后的源程序时发现。在字符串中出现法宏名不会被替换。
3)宏定义不是说明语句,行末尾不用加分号
4)宏定义必须写在函数之外,其作用域是宏定义命令起到源程序结束,如果要终止其作用域可以使用#undef命令
#define R 3
#define PAI 3.14
#define AREA PAI*R*R//嵌套使用
#define P struct Person //替换关键词
p {
Int age;
};
有参宏的定义和使用
带参宏的定义形式:
#define 宏名 (形参表) 字符串
#define M1(x,y) x*y+x+y
result =M1(4,5);
有参宏使用注意事项:
1)宏的形参之间可以出现空格,但是宏名和形参之间不能出空格,因为出现空格之后宏名和形参就会分开,形参被分到了替换的那一部分。
2)宏的形参是不需要定义类型的
有参宏定义时,各个值最好用括号括起来,这样做表达式替换的时候不易出错。
#define M1(x,y) (x)*(y)+(x)+(y)
3)宏定义多个语句
#define M3(m,n) m=a+2;n=a*2;(这里后面有分号,给语句加的)
typedef和#define的区别
1)
#define INT1 int*//宏定义(替换字符串)
typedef int* TINT;//替换别名
int num=10;
INT1 a,b;//相当于int * a,b;
//a是一个指针
a=#
//b是一个int型数
b=num;
TINT a1,b1;//相当于int* a1,int* b1;
//a1是一个指针
a1=#
//b1也是一个指针
b1=#
从这个例子可以看出,宏定义只是简单的字符替换,没有附带任何的功能。
但是替换操作(typedef),在使用别名时,作用会施加到所有的变量上!!!
宏定义只是简单的字符串替换,是预处理完成的,而typedef是在编译时处理的,它不是做简单的替换,而是对类型说明符重新命名,被命名的标识符具有类型定义说明的功能,施加到它后面的没有个变量。
|
|