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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值