Objective-C : #define 用法解析

在 C 语言中,预处理代码 (Preprocessor) 是非常强大的工具,能让你的代码变得更加易读和易改。利用预处理代码,你可以重新定义代码的一部分,使得你的代码更适合你的风格。预处理代码 (Preprocessor) 在代码编译之前被提前处理。预处理代码均由一个井号 (#) 打头。
1. 关于 #define
#define 声明主要用于将常量(或字符串)赋予有意义的名字,比如当你在编写一个日历程序时,可以定义:
  1. #define MONTHS_PER_YEAR 12
复制代码
请注意格式。 #define  命令之后为常量名,再之后为所赋的代替值,用空格隔开,结尾不需分号。
  1. #define 常量名 代替值
复制代码
通常情况下,习惯将预处理的常量名全大写,单词之间用下划线隔开(与正常变量区分)。这样做的原因是在编译器处理这段  #define 代码时,会自动寻找空格,空格之后的被认为是代替值。这也是为什么在每一行代码的末尾不用加分号的原因,因为如果加了分号,分号本身也会被认为是代替值的一部分。
一个被定义的常量名并不是一个变量;它的值一旦被定义,便不能再被改变。  #define 声明通常位于一个文件的顶部,紧接在  #import 文件导入定义之后。需要注意的是,  #define 声明必须位于常量名使用之前(不像方法 (method) 可以放在文件中任意位置)。
使用  #define 的另一个例子是储存一些有意义的数值, 比如
  1. #define PI 3.141592654
  2. // 计算圆的面积使用 "PI * radius * radius" 即可
复制代码

,这比处处书写 3.141592654 要方便许多。(改起来也快很多)

2. 更高级的用途

注意,预处理代码起的作用实际上相当于在编译之前,在整个代码中进行了一次“搜索、替换”功能。这意味着  #define有许多更复杂、更高级的用途。
我们先从 2π 开始,将  TWO_PI 定义为 2π:
  1. #define TWO_PI 2.0 * 3.141592645
复制代码
由于我们之前曾定义过 π,我们同样可以在定义中使用定义后的常量名来指代:
  1. #define TWO_PI 2.0 * PI
复制代码
除了常量以外,你还可以利用预处理定义 Objective-C 代码中任意一段字符或字符串,例如:
  1. #define AND &&
  2. #define OR ||
  3. #define EQUALS ==

  4. if (y EQUALS 0 OR y EQUALS 1) // …
复制代码
合理地利用  #define ,可增强代码的可读性。对比下列两行代码:
  1. if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))

  2. // 或

  3. #define IS_LEAP_YEAR (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)
  4. if (IS_LEAP_YEAR) // 代码可读性更强。
复制代码
一个定义通常应在一行代码中完成。但如果你需要手动空行,那么在每行后输入一个后划线(\)即可将几行代码连接起来成为一行。例如:
  1. #define IS_LEAP_YEAR(y) (y % 4 == 0 && y % 100 != 0) \
  2. || (y % 400 == 0)

  3. if ( IS_LEAP_YEAR(currentYear) )
复制代码
3. 宏
#define 声明中还可以使用参数,并且可使用多个参数;这一特性被称为“宏”:
如:
  1. #define SQUARE(x) ( (x) * (x) )
复制代码
此时,  y = SQUARE(v + 1); 等价于  y = ( (v + 1) * (v + 1) );
两个参数
例如,你可以定义:
  1. #define CalcInterest(x,y) ( x * y )
复制代码
代码中便可书写:
  1. int earnings = CalcInterest(10,5));
复制代码
多个参数
例如,在代码中,你需要频繁使用  [NSArray arrayWithObjects: object, ..., nil] 这一命令。利用 #define,你可以简化代码:
  1. #define Array(FIRST, ...) [NSArray arrayWithObjects: FIRST, ##__VA_ARGS__, nil]
复制代码
其中  ##__VA_ARGS__ 用于表示省略号所代表的所有内容。
4. # 算符以及 ## 算符
# 算符可产生一个 C-语言 格式的字符串。如:
  1. #define string(x) #x //则 string(testing) == "testing"
复制代码
## 算符用来连接两段字符串。假设你有一组变量, x1  到  x100 。如果你想打印其中某一个变量的值。你可以这样定义:
  1. #define printxvar(n) printf("%i\n", x ## n)
复制代码
由此,  printxvar(20); 在编译时将被识别为  printf(“%i\n”, x20);。这样只需要输入  printxvar(n);便可以打印出  xn 的值。
其实,##最常用的用途还是上面介绍的  ##__VA_ARGS__,它可用来抓取省略号所代表的所有内容。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值