清华大学出版社 TSINGHUA UNIVERSITY PRESS # g 8.8 maino G的有效范围 fundef g f10 由于# undef的作用,使G的作用范围在#unde行处终止,因 此在f函数中,g不再代表88。这样可以灵活控制宏定义 的作用范围
#define g 8.8 main() { | G的有效范围 … } #undef g f1() { … } 由于#undef的作用,使G的作用范围在#undef行处终止,因 此在f1函数中,g不再代表8.8。这样可以灵活控制宏定义 的作用范围
清华大学出版社 TSINGHUA UNIVERSITY PRESS (7)在进行宏定义时,可以引用已定义的宏名,可以 层层置换。 例92 #define r3.0 #define pi 3. 1415926 #define 2*pr #define s prr maino printf("l=%fns=%fn", L, S);
(7) 在进行宏定义时,可以引用已定义的宏名,可以 层层置换。 例9.2 #define R 3.0 #define PI 3.1415926 #define L 2*PI*R #define S PI*R*R main() { printf("L=%f\ns=%f\n",L,S); }
清华大学出版社 TSINGHUA UNIVERSITY PRESS 运行情况如下 L=18.849556 s=28.274333 经过宏展开后,prin函数中的输出项L被展开为 231415926230,S展开为3.1415926*3.0*3.0, printi数调用语句展开为 printf("L=%fns=%fn",2*3.141592623.0, 31415926*3.0÷3.0) (8)对程序中用双括号括起来的字符串内的字符,即 使与宏名相同,也不进行置换。如例92中的 printf数内有两个字符,一个在双引号内,它 不被宏置换,另一个在双引号外,被宏置换展开
运行情况如下: L=18.849556 s=28.274333 经过宏展开后,printf函数中的输出项L被展开为 2*3.1415926*3.0,S展开为 3.1415926*3.0*3.0, printf函数调用语句展开为 printf("L=%f\ns=%f\n",2*3.1415926*3.0, 3.1415926*3.0*3.0); (8) 对程序中用双括号括起来的字符串内的字符,即 使与宏名相同,也不进行置换。如例9.2中的 printf函数内有两个l字符,一个在双引号内,它 不被宏置换,另一个在双引号外,被宏置换展开
清华大学出版社 TSINGHUA UNIVERSITY PRESS (9)宏定义是专门用于预处理命令的一个专用名词, 它与定义变量的含义不同,只作字符替换,不分 配内存空间。 9.12带参数的宏定义 不是进行简单的字符串替换,还要进行参数替换。 其定义的一般形式为 # define宏名(参数表)字符串 字符串中包含在括弧中所指定的参数。如: #define s(a, b)a*b area=S3, 2)
(9) 宏定义是专门用于预处理命令的一个专用名词, 它与定义变量的含义不同,只作字符替换,不分 配内存空间。 9.1.2 带参数的宏定义 不是进行简单的字符串替换,还要进行参数替换。 其定义的一般形式为 #define 宏名(参数表) 字符串 字符串中包含在括弧中所指定的参数。如: #define s(a,b) a*b area=s(3,2);
清华大学出版社 TSINGHUA UNIVERSITY PRESS 定义矩形面积S,a和B是边长。在程序中用了s(3, 2),把3、2分别代替宏定义中的形式 #t define s(a, b) axb area=S(3,2);得32 图9.1
定义矩形面积S,a和B是边长。在程序中用了s(3, 2),把3、2分别代替宏定义中的形式 图9.1