objective-C [预处理程序]
2012-11-01 14:19
281 查看
作者 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 用于取消定义过的名称
预处理程序都是用#标记的
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 用于取消定义过的名称
相关文章推荐
- 黑马程序员——Objective-C程序设计(第4版)学习笔记之12-预处理程序——黑马 IOS 技术博客
- Objective-C 学习笔记 12 预处理程序
- Objective-C 学习笔记5 预处理程序
- 看看预处理程序Objective-C怎么成魔的
- Objective-C之成魔之路【13-预处理程序】
- Objective-C之成魔之路【13-预处理程序】
- 预处理程序Objective-C之成魔之路
- Objective-C预处理程序
- 预处理程序Objective-C之成魔之路
- Objective-C之成魔之路【13-预处理程序】
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第十二章 预处理程序
- 预处理程序Objective-C之成魔之路
- Objective-C之预处理程序
- 预处理程序Objective-C之成魔之路
- 预处理程序Objective-C之成魔之路
- Objective-C基础—预处理程序
- 关于程序里的一些基本的“断言”和“序列化”的预处理定义
- C语言-预处理程序
- Windows 下使用 GNUstep 编译并运行 Objective-C 程序
- c程序的预处理,编译,连接过程。