objective-c预处理

刚开始学objective-c所有这个文章只做为记录学习的笔记

看了objective-c 2.0的程序设计第12章中有一个预处理。一直以来我从c++ as3  c#来都没有认真的去总结过。以为平时会使用就好。但是今天开始打算看书的方式转变一下,用我之前QQ空间的签名的一句话“看的懂的要认识看,看不懂的要硬着头皮看”,为了发扬我这种精神决定把他一个字一个字的理解到脑子里,那就开始吧.

1. #define

#define TRUE 1 使用他时会自动在该程序中将这个名称替换为预定义的值1.在这不得不在重提出c语言中的const,c++中的inline的区别。学习的语言多了有时候会乱了,所以我觉的可以使用比较相同点与不同点来记住.

#define是在预处理时展开,而const是在编译时才会使用进来。

#define只是展开来,有类型,所以不会对他进行检测,而const是有类型的,所以在编译时可以对他进行类型检测

#define宏只是展开,有多少地方使用,就会展开多少次,不分配内存。而const是有分配内存的(可以在堆中也可以在栈中)

const  可以节省空间,避免不必要的内存分配。 例如:  
        #define PI 3.14159 //常量宏  
        const doulbe Pi=3.14159; //此时并未将Pi放入ROM中 ......  
        double i=Pi; //此时为Pi分配内存,以后不再分配!  
        double I=PI; //编译期间进行宏替换,分配内存  
        double j=Pi; //没有内存分配  
        double J=PI; //再进行宏替换,又一次分配内存!  
        const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而 #define定义的常量在内存中有若干个拷贝

const的效率也比#define更高,因为普通的const在编译期时不分配内存,所是保存在符号列表中,这使得他成为编译期间的一个常量,没有读取与存的操作所以更高效。

其实我个人觉的最重要的是,因为有了类型所以const更优与#define,因为没有类型出错检查不好调试.

#define与inline在使用的时候可能在网络上面都会找的到区别,inline是内联函数

#define MAX( (a), (b) ) (a)>(b)?(a):(b)

如果我们这样子调用MAX(i++, j++);

这个时候i与j的值会被加两次,这不是我们想要的。

所以就有inline的产生。他比一般的函数运行效率高,而又可以调度。inline一直以为是c++专用,但是他是c中也是可以的如:gcc  g99有兴趣可以去看一下,(说是讲预处理怎么说了这么多别的)

#define其实还是有他的优点的如:

#define AND &&

#define OR ||

if( (x>0) AND (x<10) )

他可以直接替换一些符号


#运算符

#define str(x)   #x

如果在宏定义中参数之前放一个#,那么在调用该宏进,预处理程序将根据宏参数创建C风格的常量字符串

str(teststring)----->输出:"teststring"


##运算符

在宏定义中,##这个运算符用于把两个标记(token)连在一起,它的前面(或后面)是宏的参数名称。预处理程序使用调用宏时提供的实际参数,并且根据这个参数和##之前(或之后)的标记创建单个标记

#define printx(n)   printf("%i", x##n)

printx(20);

printf("%i", x20);


宏中调用宏

#define printint(var) printf(#var "=%i\n", var)

#define printx(n)  printint(x##n)

printx(10);

扩展为printint(x10);

然后扩展为printf("x10" "=%i\n", x10);

最终变成printf("x10 = %i\n", x10);



2.#import语句

这个应该说是我在as3与objective-c才看到的。他与c++ #include相同的功能


3.条件编译

#ifdef,#endif,#else和#ifdef语句

通过利用预处理程序中的条件编译能力,能够减少在程序移植过程中不得不更改的这些定义的问题。如

#ifdef MAC_OS_X

#define DATADIR "/uxn1/data"

#else

#define DATADIR "\usr\data"

#endif


#ifdef所指定的符号可以通过#define语句或命令行定义如:

#define MAC_OS_X或#define MAC_OS_X 1

gcc -framework Foundation -D POWER_PC program.m

为预处理程序定义了名称POWER_PC,它使program.m中的所有#ifdef POWER_PC语句判断为TRUE


4.#if和elif预处理程序的语句

#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5

#define NSMaximumStringLength (INT_MAX - 1)

#endif

5#undef

在一些情况下,可能要使一些已经定义的名称成为未定义的,通过使用#undef语句就可以这么做。要消除特定名称的定义,编写如下语句:

#undef name

#undef POWER_PC

将消除POWER_PC name的定义。之后的#ifdef POWER_PC 或#if defined(POWER_PC)语句都将判断为假


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值