宏定义又称宏替换,就是定义一些简单的符号来代替另一些比较复杂的符号,它只是在编译前做的一个简单替换,这个替换过程称为宏展开。使用宏定义,可以减少程序中重复输入某些复杂符号的工作量,还可以提高程序的可移植性。宏定义是由宏定义命令来实现的,由#define开始的行称为宏定义命令行。宏定义命令有两种类型:不带参数的宏定义和带参数的宏定义。下面重点介绍不带参数的宏定义。
不带参数的宏定义的一般形式:
#define标识符 替换列表
功能:用一个指定的标识符(也称宏名)来代表一个替换列表,标识符和替换列表之间要用空格分隔。
替换列表是一系列C语言记号,包括标识符、关键字、数、字符常量、字符串常量、运算符和标点符号。当预处理器遇到一个宏定义时,会做一个“标识符”代表“替换列表”的记录。在文件后面的内容中,不管标识符在任何位置出现,预处理器都会用替换列表代替它。
需要注意:
(1)这就是前面介绍过的符号常量的定义方法。在使用宏定义时,标识符一般情况下用大写字母,这样可以有效地与变量名相区别,这只是习惯而并非规定,也可以用小写字母。
(2)不要在宏定义中放置任何额外的符号,否则它们会被作为替换列表的一部分。此类错误常见的有以下两种。
①在宏定义末尾使用分号。宏定义并不是C语句,所以不要在它的后面加分号。如果加了分号,则会将分号当成字符串的一部分一起进行替换。
例如:
#define PI 3.14;
经替换后,编译系统认为PI的值是“3.14;”而不是“3.14”。
②在宏定义中使用赋值运算符。
例如:
#define N=100 //WRONG
int a[N]; //等价于int a[=100];
在上面的例子中,实际上是把N定义成一对记号(=和100)。
(3)#define命令一般放在函数外面,作用域从其定义位置起到文件结束。在使用的时候,一般放在程序的最前面。如要终止其作用域,可使用#undef命令。
例如:
#define PI 3.14
int main()
{
·
·
·
}
#undef PI
f1()
{
·
·
·
}
本例子中,PI只在main()函数中有效,而在函数f1()中无效。
(4)在进行宏定义时,可以使用已定义的宏名。后面例子中会涉及。
(5)宏名在源程序中若用引号括起来,则预处理程序不对其作宏代换。
【例11.1】定义宏名STU表示52。
程序内容如下:
1 #include<stdio.h>
2 #define STU 52
3 int main()
4 {
5 printf("STU");
6 printf("\n%d\n",STU);
7 return 0;(www.xing528.com)
8 }
程序结果如图11.1所示:
图11.1 例11.1程序结果图
【例题中关键问题说明】
(1)本例中定义宏名STU表示52,但在第一个printf语句中STU被引号括起来,因此不作宏代换,即把前一个“STU”当字符串处理。
(2)第二个printf语句中STU没有被引号括起来,就表示宏STU要作宏代换。
(6)宏定义只是在编译前做一个简单的替换,并不进行错误检查。要等到编译开始后,才能对替换的字符串进行错误检查。编译器会将每一处使用这个宏的地方标为错误,而不会直接找到错误的根源——宏定义本身。
(7)宏定义是专门用于预处理命令的一个专用名词,它与定义变量的含义不同,只作字符替换,不分配内存空间。
【例11.2】求圆的周长、面积及球的体积。
算法一:只用一个宏来实现。
程序内容如下:
1 #include<stdio.h>
2 #define PI 3.1415926
3 int main()
4 {
5 float l,s,r,v;
6 printf("input radius:");
7 scanf("%f",&r); //输入圆的半径
8 l=2.0*PI*r; //圆周长
9 s=PI*r*r; //圆面积
10 v=4.0/3.0*PI*r*r*r; //球体积
11 printf("l=%10.4f\ns=%10.4f\nv=%10.4f\n",l,s,v);
12 return 0;
13 }
程序结果如图11.2所示:
图11.2 例11.2算法一程序结果图
算法二:用多个宏来实现,在进行宏定义时,使用已定义的宏名。
程序内容如下:
1 #include<stdio.h>
2 #define R 3.0
3 #define PI 3.1415926
4 #define L 2*PI*R
5 #define S PI*R*R
6 int main()
7 {
8 printf("L=%f\nS=%f\n",L,S);
9 return 0;
10 }
程序结果如图11.3所示:
图11.3 例11.2算法二程序结果图
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。