·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> app软件开发 >> IOS开发 >> 预处理程序之#define的使用

预处理程序之#define的使用

作者:佚名      IOS开发编辑:admin      更新时间:2022-07-23
 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.141592654
11  #define TWO_PI 2.0 * PI // 两个表达式前后颠倒也是合法的
12  [规则:在程序中使用预定义名称时,只要所有的符号都是定义过的,那么就可以在定义中引用其他预定义的值]
13  */
14 
15 /** 命名规范:预定义的名称都用大写,如PI,或者在定义之前加k,但k之后的字符并不全部大写,如kMaxValues; */
16 
17 /** 1.1 简单使用 */
18 #define PI 3.141592654
19 #define TWO_PI 2.0 * PI
20 
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 * x
36 // 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 : NSObject
49 @PRoperty(nonatomic, assign) int radius; // 圆的半径
50 @property(nonatomic, assign) int year;
51 - (double)area;
52 - (double)circumference;
53 @end
54 
55 
56 @implementation Circle
57 - (double)area
58 {
59     return PI * _radius * _radius;
60 }
61 - (double)circumference
62 {
63     return 2.0 * PI * _radius;
64     return TWO_PI * _radius;
65 }
66 @end
67 
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 }