刚开始学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
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)语句都将判断为假