首页 理论教育 宏定义及实现方法-C语言程序设计

宏定义及实现方法-C语言程序设计

时间:2023-10-29 理论教育 版权反馈
【摘要】:宏定义是由宏定义命令来实现的,由#define开始的行称为宏定义命令行。下面重点介绍不带参数的宏定义。①在宏定义末尾使用分号。宏定义并不是C语句,所以不要在它的后面加分号。例如:#define PI 3.14;经替换后,编译系统认为PI的值是“3.14;”而不是“3.14”。定义宏名STU表示52。宏定义只是在编译前做一个简单的替换,并不进行错误检查。

宏定义及实现方法-C语言程序设计

宏定义又称宏替换,就是定义一些简单的符号来代替另一些比较复杂的符号,它只是在编译前做的一个简单替换,这个替换过程称为宏展开。使用宏定义,可以减少程序中重复输入某些复杂符号的工作量,还可以提高程序的可移植性。宏定义是由宏定义命令来实现的,由#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算法二程序结果图

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈