首页 理论教育C语言程序设计第2版:无参宏定义的使用

C语言程序设计第2版:无参宏定义的使用

【摘要】:不带参数的宏用指定标识符来代替一个字符串。其一般格式为:#define标识符 字符串例如:#define PI 3.1415926用标识符PI来表示3.1415926,这叫做宏定义。但多数人习惯把所有的宏定义都写在文件的前面虽然这不是必须的。一个宏定义后,就可以在程序中使用了,例如:这个函数返回圆的面积。这里的1、0与一般意义下的1、0形式上没有任何不同,不容易让人理解,有了宏,我们就可以很方便地解决这个问题了。

不带参数的宏用指定标识符来代替一个字符串。其一般格式为:

#define标识符 字符串

例如:

#define PI 3.1415926

用标识符PI来表示3.1415926,这叫做宏定义。这时的字符串是一个字符序列,除非是表示一个字符串常量,一般不用双引号括起。另外,宏不是语句,它不以分号结束,而以换行符结束。当宏比较长(在一行写不下)时,可在行尾加上符号\表示下一行是这一行的继续,例如:

#define MESSAGE"if the length of this message\

is very long"

一个宏的作用域是从定义处一直到本文件的结束。但多数人习惯把所有的宏定义都写在文件的前面虽然这不是必须的。

一个宏定义后,就可以在程序中使用了,例如:

这个函数返回圆的面积。如果不用宏可以写成

上面两个程序结果是完全一样的。

在实际情况中,预处理程序对宏的处理是:遇到宏名(标识符)就用其代表的字符串替换,即所谓的宏替换。因此,上面第一个程序在正式编译之前,系统就将其先预处理为上面第二个程序的形式。预处理是编译时由系统自动完成的,用户不必关心。从用户角度看,使用宏可以使程序具有更好的可读性。

程序中使用的常量一般都有一定的物理意义,人们很难从数字本身中看出这种意义。比如,C语言中没有专门的逻辑变量,为了进行逻辑运算,规定表达式非0时为真(true),给出的逻辑值为1;表达式为0时为假(false),给出的逻辑值为0。这里的1、0与一般意义下的1、0形式上没有任何不同,不容易让人理解,有了宏,我们就可以很方便地解决这个问题了。例如:

#define TRUE 1

#define FALSE 0

定义之后,当需要给出逻辑值真时就使用TRUE,当需要给出逻辑值假时就用FALSE。

在定义宏时,还可以用到以前定义的宏,如(www.chuimin.cn)

#define PI 3.1415926

#define R 2.0

#define AREA PI*R*R

这里定义AREA时用到了另外两个宏PI和R。

最后指出在程序设计中,使用宏定义预处理命令时应特别注意的地方:

(1)宏定义以换行结束,不要用分号结束,如果PI定义为

#define PI 3.1415926;

return(PI*r*r);

经替换后变成

return(3.1415926; *r*r);

一看就知道是错误的。

(2)如果双引号内出现与宏名相同的字符串,则这个字符串不被替代。例如

运行结果:

what is your name

HELLO