你的位置:首页 > 操作系统

[操作系统]预处理程序之#define的使用


 1 #import <Foundation/Foundation.h> 2  3 /** 1.define语句:预定义名称右边的所有字符都会被预处理程序替换到程序中 */ 4 /** 5  * 使用注意: 6  * 1.预定义名称不是变量,不能给它赋值,除非替换指定值的结果实际上是一个变量; 7  * 2.语句末尾不能出现分号“;”; 8  * 3.预处理程序定义的右面不必是合法的Objective-C表达式,如 #define AND && 9  * 4.预定义的值可以引用另一个预定义的值,如10  #define PI 3.14159265411  #define TWO_PI 2.0 * PI // 两个表达式前后颠倒也是合法的12  [规则:在程序中使用预定义名称时,只要所有的符号都是定义过的,那么就可以在定义中引用其他预定义的值]13 */14 15 /** 命名规范:预定义的名称都用大写,如PI,或者在定义之前加k,但k之后的字符并不全部大写,如kMaxValues; */16 17 /** 1.1 简单使用 */18 #define PI 3.14159265419 #define TWO_PI 2.0 * PI20 21 /** 1.2 检测变量year是不是闰年 */22 /**23 #define IS_LEAP_YEAR year % 4 == 0 && year % 100 != 0 \24     || year % 400 == 0 // if (IS_LEAP_YEAR)25 // 上面的define实际上是这个意思: if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)……26 */27 28 /** 1.3 将IS_LEAP_YEAR定义为带有一个名为y的参数,来判断任何一年是否为闰年 */29 #define IS_LEAP_YEAR(y) y % 4 == 0 && y % 100 != 0 \30     || year % 400 == 0 // 这里没有定义参数y的类型,因为这里仅执行字面文本替换,并没有调用函数,注意:预定义名称和参数列表的左括号之间不允许空格31 // if (IS_LEAP_YEAR(nextYear)) 用来判断nexYear的值是不是闰年32 // 上面的define实际上是这个意思: if (nextYear % 4 == 0 && nextYear % 100 != 0 || nextYear % 400 == 0) ……33 34 /** 1.4 带参数的宏定义的一个“小陷阱” */35 #define SQUARE(x) x * x36 // y = SQUARE(v) 等价于 y = v ^ 2;而y = SQUARE(v + 1) 等价于 y = v + 1 * v + 1,而不是等于 y = (v + 1) * (v + 1)。因为与处理程序对宏定义的参数是实行文本替换的,要想解决这个问题,需要加括号, #define SQUARE(x) ((x) * (x))37 38 /** 1.5 练习:创建个分数 */39 #define MakeFract(x,y) ([[Fraction alloc] initWith: x over: y])40 // 创建分数1/3 myFract = MakeFract(1,3);41 42 /** 1.6 注意:运算符的优先级的问题43  * &运算符是按位AND运算符,它的优先级低于宏中使用的>运算符。如果宏定义中没有括号,>运算符将在按位AND之前求值。44  * 题: #define IS_LOWER_CASE(x) ( ((x) >= 'a') && ((x) <= 'z') )45 */46 47 48 @interface Circle : NSObject49 @property(nonatomic, assign) int radius; // 圆的半径50 @property(nonatomic, assign) int year;51 - (double)area;52 - (double)circumference;53 @end54 55 56 @implementation Circle57 - (double)area58 {59   return PI * _radius * _radius;60 }61 - (double)circumference62 {63   return 2.0 * PI * _radius;64   return TWO_PI * _radius;65 }66 @end67 68 69 int main(int argc, const char * argv[]) {70   @autoreleasepool {71     Circle *c = [[Circle alloc] init];72     c.radius = 5;73     NSLog(@"圆的面积是%f平方米,圆的周长是%f米", [c area], [c circumference]);74   return 0;75   }76 }