黑马程序员——预处理程序
预处理程序提供了一些工具,使用这些工具更易于开发、阅读、修改程序,也易于将程序移植到不同的系统中。
预处理程序语句使用井号(#)标记,这个符号必须是一行中的第一个非空格字符。
#define
#define语句的基本用途之一就是给符号名称指定程序常量
#define PI 3.1415926
定义了名称PI,值为3.1415926,之后PI可用于程序中任何需要常量PI的地方。
area = PI * r * r;
对常量值使用预定义名称有助于加强程序的扩展性
#define MAX_LENGTH 1000
这样,所有的引用都可以以这个数组的大小为基础,并且根据这个预定义的值确定数组的有效下标。假如程序在任何需要用到数组大小的地方都使用MAX_LENGTH,如果后来需要修改数组的大小,程序中唯一必须改动的语句就是前面的定义。
#define经常放在程序开始,但在#import或include之后,这并不是必须的,它可以出现在程序的任何地方。但要注意,需要使用这个名称之前,必须先定义它。
使用预定义需要注意,预定义其实是进行文本替换,因此通常不能使用分号结束#define语句。
#define PI 3.1415926;
// 使用PI时,会将PI替换为3.1415926;
area = PI * r * r;
// 替换为 area = 3.1415926; * r * r;
这样会导致语法错误。
带有参数的预定义,通常称为宏。宏定义需要特别小心。如
#define SQUARE(x) x*x
这个宏定义虽然看上去简单明了,但是不注意很出现问题
y = SQUARE(4+1);
// 实际上,替换文本后,上面的表达式会变成
// y = 4+1*4+1;
// y = 9;
给x加上括号
#define SQUARE(x) (x)*(x)
那么这样修改后还会有问题吗?会的。
y = SQUARE(5) / SQUARE(5);
// y = (5)*(5)/(5)*(5);
// y = 25; 也得不到预期的结果。
因此,整个表达式还需要一对括号。
#define SQUARE(x) ((x)*(x))