编程爱好者联盟 2016-09-17
--------预处理程序--------
例如:
#define Constant 1//预处理程序语句后面不要加分号(;) ,因为预定义名称一出现,预处理程序就会将右边的所有字符替换到程序中去。所以在预处理程序语句的后面不需要加 分号(;) ,不然也会一并替换到程序中
代码定义了程序常量 Constant ,并使他的值等于 1 。在这之后,在任何需要常量 1 的地方都可以用 Constant 来替代。预处理程序会在程序中将这个名称(Constant)替换为预定义的值 1。
预处理程序会将 #define 语句中预定义名称右边的所有字符都替换到程序中去。所以在预定义名称的右边,可以是常量、语句、代码或是任何有意义的东西。
#define 语句经常放在程序的开始,但 #import 或 include 语句之后。这并不是必须的,他们可以出现在程序的任何地方。但是,在程序中应用这个名称之前,必须先定义他们。
预定义的名称和变量的行为方式不同,没有局部定义之类的说法。在定义一个名称之后,就可以在程序的任何地方使用它。
预定义的值本身可以引用另一个预定义的值。
定义带有参数的宏:
在定义带有参数的名称时,预定义名称的参数列表的左括号之间不允许空格。
带参数的宏定义的一般形式如下:#define <宏名>(<参数表>) <宏体>
其中, <宏名>是一个标识符,<参数表>中的参数可以是一个,也可以是多个,视具体情况而定,当有多个参数的时候,每个参数之间用逗号分隔。<宏体>是被替换用的字符串,宏体中的字符串是由参数表中的各个参数组成的表达式。例如:
#define SUB(a,b) a-b
如果在程序中出现如下语句:
result=SUB(2, 3);
则被替换为:
result=2-3;
如果程序中出现如下语句:
result= SUB(x+1, y+2);
则被替换为:
result=x+1-y+2;
在这样的宏替换过程中,其实只是将参数表中的参数代入到宏体的表达式中去,上述例子中,即是将表达式中的a和b分别用2和3代入。
我们可以发现:带参的宏定义与函数类似。如果我们把宏定义时出现的参数视为形参,而在程序中引用宏定义时出现的参数视为实参。那么上例中的a和b就是形参,而2和3以及x+1和y+2都为实参。在宏替换时,就是用实参来替换<宏体>中的形参。
预处理程序换行规则:
通常,预处理程序假设定义包含在程序的一行中。如果需要第二行,那么上一行的最后一个字符必须是反斜杠线符号(\)。这个字符告诉预处理程序这里存在一个后续。对于多个后续行也同样是如此。
#import 语句(导入文件指令):
导入文件最出色的能力之一是他是你能够把定义集中起来,从而确保所有的程序应用相同的值。
//例句:
#import "file.h"
在 Objective-C中,#import 被当成 #include 指令的改良版本来使用。除此之外,#import 确定一个文件只能被导入一次,这使你在递归包含中不会出现问题@class一般用于头文件中需要声明该类的某个实例变量的时候用到,在m文件中还是需要使用#import@class就是告诉编译器有这么一个类,至于类的定义是啥不知道@class一般用于头文件中需要声明该类的某个实例变量的时候用到,在m文件中还是需要使用#import #import<> 跟 #import""又什么区别?“”的意思是自己创建的文件,用这个首先会在当前的目录中寻找,如果找不到就到其他的位置寻找,“”和<>是相对的一个是自己创建的文件一个是系统的文件
条件编译: 条件编译通常用于创建可以在不同系统上编译运行的程序。他还经常用来开关程序中的各种语句。
#ifdef、#endif、#else和#ifndef语句: //例:如果前面已经定义了一个符号(IPAD),下面的语句就把 kImageFiel 定义为 @"barnHD.png" ,否则就定义为 @"barn.png"
#ifdef IPAD
#define kImageFile @"barnHD.png"
#else
#define kImageFile @"barn.png"
#endif//如果程序编译时,#ifdef 行中所指定的符号已经通过 #define 语句或命令行定义了,那么编译器将处理从此处开始到 #else 、#elif 或 #endif 的程序段,否则将忽略这个程序段。
#if 和 #elif 预处理程序语句: if 语句可以用来检测常量表达式是否为非零。如果表达式结果为非零,就会处理到 #else、#elif 或 #endif 位置的所有后续行。否则将跳过他们。
//例:这里讲预定义变量 MAC_OS_X_VERSION_MIN_REQUIRED 的值与预定义变量 MAC_OS_X_VERSION_10_5 的值进行比较。如果前者小于后者,就处理随后的 #define #if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5#define NSMaximumStringLength (INT_MAX-1)
#endif//特殊运算符 define(name) 也可以用在#if语句中#if defined(DEBUG)……#endif和#if DEBUG……#endif 的作用相同
#undef 语句:
在一些情况下,可能需要使一些已经定义的名称成为未定义的,通过使用 #undef 语句就可以实现。
要消除特定名称的定义,编写如下语句
#undef name