宏是一种预处理指令,可以通过#define定义。
C语言中的宏可以分为有参数宏和无参数宏两类。
1.无参数宏(也是我们最常用的一类宏)
a.形式为:#define 标识符 宏体
(eg:#define x 100 其功能是指定标识符 x 来代替100. 这种替换主要目的是为用户在编程时提供一定的方便,并能在一定程度上提高程序的运行效率。 )
2.有参数宏
a.形式为:#define 宏名(形参表) 宏体 (形参表包括一个或多个形参,每个形参之间使用逗号分隔)
示例如下:
代码段CIRCLE(radius,clong,area)被展开成如下形式:
clong = 2*3.1415926*radius;area=3.1415926*radius*radius;
通过上述代码,我们可以看到有参宏在使用时和函数十分相似,但他们之间还是有一定区别的。
他两的区别主要如下:
1.在调用函数时,先将调用函数的地址放入堆栈,函数执行完后再将调用函数的地址从堆栈返回给程序,最后回到原调用点。 而宏展开是使用取代标识直接将宏名取代。
2.展开有参宏时,直接将实参置换形参。而在调用有参函数时,先将实参的值复制一份,然后再将复制的值传给形参。
3.在有参宏中,形参是没有类型的,因此实参可以是任何类型。但在有参函数中,形参是有类型的,因此实参的类型必须与形参保持一致。
宏的使用说明如下:
1.不允许在宏定义行尾加分号。负则宏展开时会将分号作为宏体的一个字符,用于替换宏名。
2.在宏体中如果使用字符串运算符(#),展开时该运算符作用的元素将被转换为使用引号括起来的字符串,同时与其前面的字符串连接。
3.宏名的有效范围是从定义命令之后,到当前文件结束。
4.进行宏定义时。可以引用已存在的宏名。
5.当宏定义在一行中书写不完时应该在下一行继续时,应在最后一个字符后加反斜杠“\”