在 C 语言中,预处理代码 (Preprocessor) 是非常强大的工具,能让你的代码变得更加易读和易改。利用预处理代码,你可以重新定义代码的一部分,使得你的代码更适合你的风格。预处理代码 (Preprocessor) 在代码编译之前被提前处理。预处理代码均由一个井号 (#) 打头。
1. 关于 #define
#define
#define MONTHS_PER_YEAR 12
#define
#define 常量名 代替值
#define
#define
声明通常位于一个文件的顶部,紧接在 #import
文件导入定义之后。需要注意的是, #define
#define
#define PI 3.141592654 // 计算圆的面积使用 "PI * radius * radius" 即可
,这比处处书写 3.141592654 要方便许多。(改起来也快很多)
2. 更高级的用途
#define
TWO_PI
#define TWO_PI 2.0 * 3.141592645
由于我们之前曾定义过 π,我们同样可以在定义中使用定义后的常量名来指代:
#define TWO_PI 2.0 * PI
除了常量以外,你还可以利用预处理定义 Objective-C 代码中任意一段字符或字符串,例如:
#define AND && #define OR || #define EQUALS == if (y EQUALS 0 OR y EQUALS 1) // …
#define
,可增强代码的可读性。对比下列两行代码:
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) // 或 #define IS_LEAP_YEAR (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0) if (IS_LEAP_YEAR) // 代码可读性更强。
一个定义通常应在一行代码中完成。但如果你需要手动空行,那么在每行后输入一个后划线(\)即可将几行代码连接起来成为一行。例如:
#define IS_LEAP_YEAR(y) (y % 4 == 0 && y % 100 != 0) \ || (y % 400 == 0) if ( IS_LEAP_YEAR(currentYear) )
3. 宏
#define
如:
#define SQUARE(x) ( (x) * (x) )
y = SQUARE(v + 1);
等价于 y = ( (v + 1) * (v + 1) );
。
两个参数
例如,你可以定义:
#define CalcInterest(x,y) ( x * y )
代码中便可书写:
int earnings = CalcInterest(10,5));
多个参数
[NSArray arrayWithObjects: object, ..., nil]
这一命令。利用#define
,你可以简化代码:
#define Array(FIRST, ...) [NSArray arrayWithObjects: FIRST, ##__VA_ARGS__, nil]
##__VA_ARGS__
用于表示省略号所代表的所有内容。
4. # 算符以及 ## 算符
# 算符可产生一个 C-语言 格式的字符串。如:
#define string(x) #x //则 string(testing) == "testing"
x1
到 x100
。如果你想打印其中某一个变量的值。你可以这样定义:
#define printxvar(n) printf("%i\n", x ## n)
printxvar(20);
在编译时将被识别为 printf(“%i\n”, x20);
。这样只需要输入 printxvar(n);
便可以打印出 xn
##__VA_ARGS__
,它可用来抓取省略号所代表的所有内容。