第一部分
宏的概念:
被定义为“宏”的标识符称为“宏名”。
在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。"宏"分为有参数和无参数两种.
第二部分 无参宏
无参宏的使用格式: #define 标识符 字符串
使用注意事项:
1) 习惯上宏名用大写字母表示,以便于与变量区别。但也允许用小写字母
2) 宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名 ,这是一种简单的替换.预处理程序对他不作任何检查.
3) 宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起置换。
4) 宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束。如要终止其作用域
可使用 #undef命令。
5) 宏名在源程序中若用“”括起来,则预处理程序不对其作宏代换。
6) 宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的宏名。在宏展开时由预处理程序层 层代换。
7) 可用宏定义表示数据类型,使书写方便。
8) 对“输出格式”作宏定义,可以减少书写麻烦9)特别注意注意括号问题
第三部分 有参宏
对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。使用格式:#define 宏名(形参表) 字符串
有参宏使用注意事项:
1) 带参宏定义中,形参之间可以出现空格,但是宏名和形参表之间不能有空格出现。
2) 在带参宏定义中,形式参数不分配内存单元,因此不必作类型定义。而宏调用中的实参有具体 的值。要用它们去代换形参,因此必须作类型说明.带参宏中,形参和实参只是符号代换,不存在值传递的问题。
3) 在宏定义中的形参是标识符,而宏调用中的实参可以是表达式。4)在宏定义中,字符串内的形参通常要用括号括起来以避免出错。在上例中的宏定义中
(y)*(y) 表达式的y都用括号括起来,因此结果是正确的。5)宏定义也可用来定义多个语句,在宏调用时,把这些语句又代换到源程序内。