您的位置: 网站首页 > 程序开发 > C语言程序设计案例教程 > 第十章 编译预处理命令 > 【10.1 宏定义案例】

10.1 宏定义案例

 

10.1  宏定义案例

案例10.1  求圆的面积

【项目任务】

编写一个程序,求圆的面积

【设计思路】

求圆面积时,要有到圆周率这个常数,可以将其定义成一个符号常量。

【程序代码】

#include <stdio.h>

#define PI 3.1415926   /*定义不带参数的宏*/

main()

{

    float r=4.5,area;

 

    area=PI*r*r;

 

    printf("area=%.2f\n",area);

}

【运行结果】

area=63.62

【知识拓展】

这是一个不带参数的宏定义,一般形式为:

#define标识符 字符串

#define PI 3.1415926,它的作用是:在编译预处理时,用3.1415926这个字符串来代替程序中所有出现的PI标识符。这种方法可以使用户用一个简单的名字来代替一个复杂的字符串,增加程序的可读性。这个标识符称为宏名,在编译预处理时用字符串替换宏名的过程称为宏展开。

宏定义只是用宏名代替一个字符串,以增加程序的可读性,编译器是不做任何检查工作的,跟函数刚好相反。

注意:不要将#define PI 3.1415926写成#define PI=3.1415926

案例10.2  求三角形的面积

【项目任务】

编写一个程序,求三角形的面积

【设计思路】

要将计算三角形面积的公式写成带参数的宏定义,先回忆一下求三角形面积的公式。

三角形的面积计算可以使用海伦公式:

area=

其中abc为三角形的边长,s=是三角形的半周长,area为三角形的面积。

【程序代码】

#include <stdio.h>

#include <math.h>

#define S(a,b,c) 1.0/2*(a+b+c)   /*定义带参数的宏*/

#define AREA(a,b,c) sqrt(S(a,b,c)*(S(a,b,c)-a)*(S(a,b,c)-b)*(S(a,b,c)-c))

 

main()

{

    float x;

    x=AREA(3,4,5);

    printf("area=%.2f\n",x);

}

【运行结果】

area=6.00

【知识拓展】

宏定义可以分成两种类型:一种是不带参数的宏定义;另一种是带参数的宏定义。不带参数的宏定义只是简单的字符串替换;而带参数的宏定义不仅要作字符串替换,还要作参数替换。带参数的宏展开的过程,是用语句中宏名后括号内的实参代替#define命令行中的形参。

比较以下两个程序,体会其中的差异。

/*程序1*/

#include <stdio.h>

#define F(x) x*x

main()

{

    int a,b;

    a=F(2);      /*宏展开为(2*2)*/

    b=F(2+2);    /*宏展开为(2+2*2+2)*/

    printf("%d,%d\n",a,b);

}

运行结果:48

/*程序2*/

#include <stdio.h>

#define F(x) (x)*(x)

main()

{

    int a,b;

    a=F(2);      /*宏展开为(2*2)*/

    b=F(2+2);    /*宏展开为(2+2)*(2+2)*/

    printf("%d,%d\n",a,b);

}

运行结果:416

注意:带参数的宏定义与函数的区别是:函数调用时,先求实参的值,而且会作类型检查等工作;而宏定义只是作字符串和行参的替换工作,不作任何检查。所以在使用宏定义时,一定要确保所定义的宏的正确性。