作者 robin
预处理程序都是用#标记的
1.#define
所有使用#define的定义尽量都使用大写字母组合.使用预定义名称有助于加强程序的可扩展性.
不要在语句后加分号.预定义没有局部定义之说,在定义了一个名称后,就可以在程序的任何地方使用.
用途1:为符号名称指派常量
#define TURE 1 //TURE 等于 1,在之后TURE出现的地方会直接被替换成1
xxx = TURE; // 该语句等价 xxx = 1
#define 的作用类似文本编辑中的替换.
比如要用到常量 派 ,但是数字太长,可以使用下面的#define语句:
#define PI 3.1415926
在后面的方法就可以直接使用PI来替换3.1415926出现的位置.
用途2:定义表达式
#define TWO_PI 2.0 * 3.1415926
这样的话,使用TWO_PI 就可以在方法中替代2.0 * 3.1415926了.
用途3: 重新定义关键字
#define AND &&
#define OR ||
这样的话在使用AND和OR来代替&&和||,但是这是不好的习惯,尽量不要这样使用.
一个预定义的值本身可以引用另一个预定义的值.
用途4:减少注释
#define IS_LEAP_YEAR year % 4 == 0 && year % 100 != 0 || year % 400 == 0
这样的话就可以在语句中直接引用IS_LEAP_YEAR来取得值:
if(IS_LEAP_YEAR)
用途5: 设置参数#define IS_LEAP_YEAR()y y % 4 == 0 && y % 100 != 0 || y % 400 == 0
这样就不仅仅只针对year变量判断了,还可以判断其他的变量.
if(IS_LEAP_YEAR (year) )
if(IS_LEAP_YEAR (year2) )
这样的话就会用year或者是year2来替换宏中的y,这种类型的宏一般都带有1个或多个参数的定义.
在任何一个有宏的语句中,都要使用括号将参数括起来,以便出现不可预知的问题.
用途6: 定义类中的多参数方法#define Make(x,y) ([[Fraction alloc] initWith: x over : y])
使用的时候就可以用一下的表达式:myfract = Make(1, 3);
如果在宏定义中的参数前放一个#号,那么在调用该宏时,预处理程序将根据宏参数创建C风格的常量字符串.
#define str(x) # x,随后srt(testing)的调用显示为“testing”。会在参数两边加入双引号,参数中的任何双引号或者是反斜线都是预处理程序中的保留字.所以str (“test”)会得到“\”test\”"。
下面是一个比较实用的的宏定义:
#define printint(var) print (# var ” = %i\n”, var)
如果xxx = 100,则
printint (xxx) 将会被扩展为:
print (“xxx” ” = %i\n”, xxx);
编译器会把相邻的两个字符串连在一起,形成:
print (“xxx = %i\n”, xxx);
3.##运算符##运算符将两个标记连在一起,它的前面或者后面是宏参数名称.预处理程序使用调用该宏时提供的实际参数,并且根据该参数和##之后或之前的标记创建单个标记.
例如有一个从x1到x100的变量列表,可以写一个printx的宏
#define printx(n) printf(“%i\n”,x ## n)
x ## n 表示x和参数n,并根据他们构建一个标记.
printx(20)会被扩展成为:
printf(“%i\n”,x20);
4.#import语句
随着时间的推移,可能会写出一组宏,在每一个程序中使用,可以将这些宏收集到一个头文件中,然后在实现部分引用该头文件就可以了.
<>标签指的是从SDK目录中查找.
“”标签指的是从当前目录中查找.
条件编译可以在不同的机器上编译程序,也可以用来开关程序中的各种语句.
#ifdef,#endif,#else和#ifndef语句
如果在之前定义了符号MAC_OS_X,下面的语句就把DATADIR定义为/uxn1/data.
#ifdef MAC_OS_X
# define DATADIR “/uxn1/data”
#else
# define DATADIR “\usr\data”
#endif
可以在#后跟1个或多个空格,如果程序编译时,#ifdef行中所指定的符号已经通过#define定义了,那么编译期将会处理从此处到#else到#ifndef的语句,否则就忽略这部分程序.
#ifndef X //测试X是否被宏定义过
#define X
xxx1… //如果X没有被定义过,则定义,并执行xxx1
#endif
xxx2… //如果X被定义过,则执行xxx2,无视上面的内容.
#ifdef 如果定义了后面的宏,则执行
#ifndef 如果没有定义后面的宏,则执行
6.#if和#elif语句
#if提供了更通用的控制编译的语句. #elif = else if
#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 //如果MAC版本小于 10.5
#define NSMaximumStringLength (INT_MAX-1) //就执行这个,如果版本在10.5以上版本执行,就将最大值减1
#endif7.define的特殊用法
#if defined (MAC_OS_X)…
#endif
#if defined (MAC_OS_X) && MAC_OS_X
MAC_OS_X必须被定义且不等于0