objective-C [预处理程序]

作者 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);


2.#运算符

如果在宏定义中的参数前放一个#号,那么在调用该宏时,预处理程序将根据宏参数创建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目录中查找.

“”标签指的是从当前目录中查找.


5.条件编译

条件编译可以在不同的机器上编译程序,也可以用来开关程序中的各种语句.

#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

#endif

7.define的特殊用法

#if defined (MAC_OS_X)

#endif


#if defined (MAC_OS_X) && MAC_OS_X

MAC_OS_X必须被定义且不等于0


#undef 用于取消定义过的名称
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值