第章編铎预处理 (1)宏名一般习惯用大写字母表示,以便与变量名相区 别。当然可以使用小写字母。 (2)宏定义是用宏名简单替换宏体,也就是作简单的置 换,不作语法检査,出现错误也不会报告,只有在宏展开 后编译时才会报告错误。 (3)程序中双引号中与宏名相同的内容不被替换。 (4)宏展开后源程序将变长。 (5)使用宏名,可以减少程序中重复书写某些宏体的工 作量。 (6)宏定义一般放在程序的开头,宏名的有效范围为定 义位置到文件结束 (7)宏定义可以嵌套,后定义的宏可使用已定义的宏
第 12 章 编 译 预 处 理 (1) 宏名一般习惯用大写字母表示,以便与变量名相区 别。当然可以使用小写字母。 (2) 宏定义是用宏名简单替换宏体, 也就是作简单的置 换,不作语法检查, 出现错误也不会报告,只有在宏展开 后编译时才会报告错误。 (3) 程序中双引号中与宏名相同的内容不被替换。 (4) 宏展开后源程序将变长。 (5) 使用宏名, 可以减少程序中重复书写某些宏体的工 作量。 (6) 宏定义一般放在程序的开头, 宏名的有效范围为定 义位置到文件结束。 (7) 宏定义可以嵌套, 后定义的宏可使用已定义的宏
第章編铎预处理 1212带参数的宏定义 定义形式: # define宏名(参数表)宏体 带参数的宏展开时要从左至右进行参数的简单替换, 使用起来较无参数宏定义复杂。 例如: 1)# define S(n (n)*(n)*(n) ( 2)# define T(n) 1/(n) 第一个式子代表n的立方,第二个式子代表n的倒数
第 12 章 编 译 预 处 理 12.1.2 带参数的宏定义 定义形式: #define 宏名(参数表) 带参数的宏展开时要从左至右进行参数的简单替换, 使用起来较无参数宏定义复杂。 例如: (1) #define S(n) (n)*(n)*(n) (2) #define T(n) 1/(n) 第一个式子代表n的立方, 第二个式子代表n的倒数
第章編铎预处理 说明 (1)列出的参数必须在宏体中用到 (2)带参数的宏展开只是将实参简单替换形参。当实参 中含有运算,宏展开可能会出问题。 如有宏定义: # define s(n) n*n'n 若将形参n用实参a+b替换,S(a+b)会变成 a+b*a+b*a+b,显然与原意不相符。 如将宏定义改成: define s(n)(n)*(n*(n) S(a+b)为(a+b)*(a+b)*(a+b),与原意相符 因此,在带参的宏定义中,参数应加括号来描述
第 12 章 编 译 预 处 理 说明: (1) 列出的参数必须在宏体中用到。 (2) 带参数的宏展开只是将实参简单替换形参。当实参 中含有运算,宏展开可能会出问题。 如有宏定义: #define S(n) n*n*n 若将形参 n 用实参 a+b 替 换 , S ( a+b ) 会变成 a+b*a+b*a+b, 显然与原意不相符。 如将宏定义改成: #define S(n) (n)*(n)*(n) S(a+b)为(a+b)*(a+b)*(a+b),与原意相符。 因此, 在带参的宏定义中, 参数应加括号来描述