预处理程序--#define 语句

预处理程序语句使用#标记,这个符号必须是一行中的第一个非空格字符。

#define语句

#define语句的基本用途之一就是给符号名称指定程序常量。例如:

#define TRUE 1

预定义名称不是变量。因此,不能为它赋值,除非替换指定值的结果实际上是一个变量。只要在程序中使用预定义名称,#define语句预定义名称右边的所有字符都会被预处理程序自动替换到程序中,所以通常不能使用分号结束#define与语句的原因。

#define语句经常放在程序的开始,但在#import或#include语句之后。这并不是必须的,他们可以出现在程序开始的任何地方。但是,在程序引用这个名称之前,必须先定义他们。预定义的名称和变量的s行为不同:没有局部定义之类的说法。再定义一个名称之前,就可以在程序的任何地方使用它。大多数程序员把定义放在头文件中,以便在多个源文件中使用他们。

一般程序员员有这样的习惯:所有预定义的名称都用大写,这样容易区分一个名称是变量名,对象,类名,还是预定义名称。另一种常见的惯例是在定义之前加字母k,这种情况下,k之后的字符并不是大写。

名称的定义不仅可以包括简单的常量值,还可以是表达式和其他任何内容,只要在使用它的时候,结果表达式正确就可以。例如:

#define  AND &&

#define  OR    ||

#define   TWO_PI  2.0 * 3.1415926

甚至是#define EQUALS ==都可以,但是,以这种方式重新定义底层语言语法的行为通常不是好的习惯,而且会使人难以理解你的代码。更有趣的是,预定义的值本身可以引用另一个预定义的值,例如:

#define PI  3.1415926

#define   TWO_PI  2.0 * PI

如果把以上两个定义的顺序颠倒一下。也是合法的。如:

#define   TWO_PI  2.0 * PI

#define PI  3.1415926

也就是说,在程序中使用预定义的名称时,只要所有的符号都是定义过的,那么就可以在引用其他的定义。

合理使用#define 语句可以减少程序中对注释的需要。例如:

通常用如下的语句来判断闰年:

if (year % 4 ==0 && year %100 != 0 || year % 400 == 0 ),现在,用#define语句可以改成如下:

#define  IS_LEAP_TEAR    year % 4 ==0 && year %100 != 0  \

|| year % 400 == 0

if (IS_LEAP _YEAR)

{

.....

}

预处理程序假设定义包含在程序的的一行,如果需要在第二行,那么上一行的最后一个字符必须是反斜线符号,告诉编译器预处理程序这里存在一个后续,否则将自动忽略。当遇到多行时,也是如此。

事实上,可以编写一个带有一个或多个变量的定义,例如:

#define  

IS_LEAP_TEAR(y)    y % 4 ==0 && y %100 != 0  \

|| y % 400 == 0

 和方法和函数的定义不同,这里没有定义参数的类型,因为此时仅执行字面文本替换,并没有调用函数。注意,在定义带有参数的名称时,预定义名称和参数列表的左括号之间不允许有空格。当使用时,可以使用以下语句:

if (IS_LEAP_YEAR (year))

实际上,编译器其实把if语句看成是if (year % 4 ==0 && year %100 != 0 || year % 400 == 0 ),其中的year可以是任意变量或者常量来替换。这种预定义通常称为“宏”,这个术语通常用于带有一个或多个参数的预定义。

下面有一个预定义的陷阱。现有#define SQUARE x  * x

当我们使用y =  SQUARE (v)时,把V^2赋给y,但是,当我们使用y = SQUARE (v+1)时,却并不是将(v+1)^2赋给y,因为预处理程序对宏定义的参数实行文本替换,前面的表达式实际上如下求值:y = v + 1* v + 1;要解决这个问题,需要在宏中添加括号,改成:#define SQUARE(x) ((x) *(x)).

定义宏时,使用条件表达式的运算符可以非常简便。例如:#define MAX(a,b)  ( ((a) >(b)) ? (a) : (b) )

甚至可以在另一个宏定义中使用这个宏把字符从小写转换为大写,同时不改变非小写的字符:

#define  TO_UPPER(c)  (IS_LOWER_CASE (x) ? (x) - 'a' + 'A' : (x) )  

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值