黑马程序员技术交流社区

标题: 学习笔记13:宏定义 [打印本页]

作者: 新生heima    时间: 2015-8-14 17:52
标题: 学习笔记13:宏定义
被定义为宏的标识符称为 宏名,在编译预处理时对所有出现的宏名,都用宏定义中出现的字符串取代换,这称为宏定义或者宏展开。(代换后,代换部分优先级不会受影响,不会优先计算)

宏定义分为:有参数和无参数

格式:

#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是在编译时处理的,它不是做简单的替换,而是对类型说明符重新命名,被命名的标识符具有类型定义说明的功能,施加到它后面的没有个变量。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2