您的位置:首页 > 职场人生

黑马程序员---学习笔记13:宏定义

2015-08-20 13:08 1376 查看
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流!
——-

被定义为宏的标识符称为 宏名,在编译预处理时对所有出现的宏名,都用宏定义中出现的字符串取代换,这称为宏定义或者宏展开。(代换后,代换部分优先级不会受影响,不会优先计算)

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

格式:

#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是在编译时处理的,它不是做简单的替换,而是对类型说明符重新命名,被命名的标识符具有类型定义说明的功能,施加到它后面的没有个变量。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: