点点滴滴访问量:
  注:资料来源于网络及谭浩强版《C程序设计》

谓编译预处理是指,在对源程序进行编译之前,先对源程序中的编译预处理命令进行处理;然后再将处理的结果,和源程序一起进行编译,以得到目标代码。

C提供的预处理功能主要有三种

1.       宏定义与符号常量

2.       文件包含

3.       条件编译

宏定义与符号常量

在C语言中,分为无参数的宏(简称无参宏)和有参数的宏(简称有参宏)两种。

     无参宏

1.无参宏定义的一般格式

         #define   标识符   语言符号字符串

其中:“define”为宏定义命令;标识符为所定义的宏名,通常用大写字母表示,以便于与变量区别;语言符号字符串可以是常数、表达式、格式串等。

2.使用宏定义的优点

1)可提高源程序的可维护性

2)可提高源程序的可移植性

3)减少源程序中重复书写字符串的工作量

[案例9.1] 输入圆的半径,求圆的周长、面积和球的体积。要求使用无参宏定义圆周率。

/*案例代码文件名:AL8_1.C*/

/*程序功能:输入圆的半径,求圆的周长、面积和球的体积。 */

#define PI 3.1415926          /*PI是宏名,3.1415926用来替换宏名的常数*/

main()

    { float radius,length,area,volume;

       printf("Input a radius: ");

       scanf("%f",&radius);

       length=2*PI*radius;                  /*引用无参宏求周长*/

       area=PI*radius*radius;              /*引用无参宏求面积*/

       volume=PI*radius*radius*radius*3/4;        /*引用无参宏求体积*/

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

      }

3.说明

1)宏名一般用大写字母表示,以示与变量区别。但这并非是规定。

2)宏定义不是C语句,所以不能在行尾加分号。否则,宏展开时,会将分号作为字符串的1个字符,用于替换宏名。

3)在宏展开时,预处理程序仅以按宏定义简单替换宏名,而不作任何检查。如果有错误,只能由编译程序在编译宏展开后的源程序时发现。

4)宏定义命令#define出现在函数的外部,宏名的有效范围是:从定义命令之后, 到本文件结束。通常,宏定义命令放在文件开头处。

5)在进行宏定义时,可以引用已定义的宏名

6)对双引号括起来的字符串内的字符,即使与宏名同名,也不进行宏展开。

7)可以用#undef命令终止宏定义的作用域

      例:

      define G 1000

      Main()

      {

    // G 在此范围里有效

}

#undef   G

F()

{

}

 4  符号常量

在定义无参宏时,如果语言符号字符串是一个常量,则相应的宏名就是一个符号常量。

恰当命名的符号常量,除具有宏定义的上述优点外,还能表达出它所代表常量的实际含义,从而增强程序的可读性。

#define  EOF      -1         /*文件尾*/

#define  NULL     0         /*空指针*/

#define  MIN      1         /*极小值*/

#define  MAX      31        /*极大值*/

#define  STEP     2         /*步长*/

posted on 2007-12-14 17:07  sopper  阅读(1479)  评论(0编辑  收藏  举报