首页 > 代码库 > 预处理程序

预处理程序

 

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

  • 预处理程序语句使用井号(#)标记,这个符号必须是一行中的第一个非空格字符。

 

  • #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 < 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

         

 

预处理程序