预处理程序

编程爱好者联盟 2016-09-17

--------预处理程序--------

  • 预处理程序语句使用井号(#)标记,这个符号必须是一行中的第一个非空格字符。
    
  • #define 语句(这种预定义通常也被称为定义”宏):
  • #define 语句的基本用途之一就是给符号名称指定程序常量。 

例如:

#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 &lt; 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

相关推荐