Objective-C基础—预处理程序

1.预处理程序提供了一些工具,使用这些工具更易于开发,阅读,修改程序,也易于将程序移植到不同的系统中。

#define语句:#define语句的基本用途之一就是给符号名称指定程序常量。例:#define TRUE  1    定义了名称TRUE,并使它的值为1,之后TRUE可用于程序中任何需要用到常量1的地方。 #define MAX  100          之后可以用于指定最大值, int  count = MAX;

预定义名称不是变量,因此不能给它赋值。#define语句经常放在程序的开始,但#import或#include语句之后。这并不是必须的,它们可以出现在程序的任何地方,但是在程序引用这个名称之前,必须先定义它们。(在运行时才处理的事件中定义#define,通常时无效的,不要在方法中定义#define) 

预处理程序不但可以定义常量,还可以定义表达式和其他任何内容。

#define  PI  3.14
#define  TWO_PI  2*PI
#define  AND  &&
#define  OR  || 
例:
if(x > 0 AND x < 10)
....
if(x == 0 OR x == 10)
....

#define  CITY_ID  @"320400"
#define CITY_NAME  @"北京"
//定义屏幕
#define SCREENWIDTH  [[UIScreen mainScreen] bounds].size.width
#define SCREENHEIGHT  [[UIScreen mainScreen] bounds].size.height
//定义bool值
#define  IOS_8  [[[UIDevice currentDevice] systemVersion] floatValue] == 8.0  ?  YES : NO
    

//通常,预处理程序假设定义包含在程序的一行中。如果需要第二行,那么上一行的最后一个字符,必须是反斜线符号。这个符号告诉预处理程序这里存在一个后续,否则将被忽略。对于多个后续行也是如此,每个要继续的行都必须以反斜线结尾。
//定义检测year是否是闰年的运处理表达式
#define  IS_LEAP_YEAR  year % 4 ==0 && yaer % 100 != 0  \  
<span style="white-space:pre">			</span>|| year % 400 == 0
//将IS定义为带有一个名y的参数
#define  IS_LEAP_YEAR(y)   y % 4 ==0 && y % 100 != 0  \  
			|| y % 400 == 0
//使用预处理表达式检测闰年
if( IS_LEAP_YEAR(year) )
.......
带有参数的预处理,通常称为“宏”。定义宏可以简化代码,方便维护。定义宏时可以在这个宏中使用另一个或多个已定义的宏。

下面定义了检测字符是不是小写的宏:

#define IS_LOWER_CASE(x)  ( ( (x) >= 'a')  &&  ( (x)  <= 'z') )

if(IS_LOWER_CASE(c))

.....

下面定义将小写字符转换为大写的宏:

#define  TO_UPPER(x)   ( IS_LOWER_CASE(x) ? (x) - 'a' + 'A' : (x) )


2.#import语句:

当你正在开发一组预定义,并想在每一个程序中使用它们,只需将这些预定义编写在一个xx.h文件中,使用#import倒入需要用到的程序中。

假设将一组预定义输入到系统中一个名为metric.h的独立文件中。随后任何需要使用包含在metric.h中定义的程序都只需要简单的使用以下预处理程序指令:

 #import  "metric.h"

在引用metric.h中的定义之前,必须出现这条语句,并且通常放在源文件的开始处。预处理程序在系统中寻找指定的文件,并且有效地把文件地内容复制到程序中出现#import语句的确切位置。这样文件中的所有语句似乎都是直接在程序中这个位置插入的。

头文件名两侧的双引号指示预处理程序在一个或多个文件目录(通常,首先在包含源文件的目录中查找,但是通常适当的”项目设置“,可以用Xcode指定的预处理程序搜索的确切位置)中寻找指定的文件。

#import <Foundation/Foundation.h>

将导致预处理程序只在特殊的“系统”头文件目录中寻找包含文件,当前目录不会被搜索。

导入文件最出色的能力之一是它使你能够把定义集中起来,从而确保所有的程序引用相同的值。此外,如果包含文件中发现任何错误值,只需在这个位置修改,不必更正每个使用该值的程序。任何引用这个错误值的程序只需简单地重新编译以下,而不必重新编辑。


3.条件编译

条件编译通常用于创建可以在不同计算机系统上编译运行地程序。它还经常用来开关程序中的各种语句,例如,用来输出变量值或跟踪程序执行地调试语句。

(1)#ifdef, #endif, #else 和 #ifndef语句

遗憾的是,程序有时必须依靠系统相关参数,这些设备在不同设备(iphone, ipad)或特定版本的操作系统(ios7, ios8)上分别指定。

如果由大型程序,它对计算机系统的特定硬件和/或软件由很多这样的依赖(尽可能减少这种依赖),最终可能会有许多这样的定义,在程序移植到其他的计算机系统时,它们的值不得不更改。通过利用预处理程序的条件编译能力,能够减少对这些值的改变,并且能够把每种机器关于这些定义的值给结合到程序中

#ifdef IPAD //检测是否定义了预处理IPAD
# define  KImageFile  @"barnHD.png"
#else //如果没定义IPAD
# define  KImageFile  @"barn.png"
#endif
要为预处理程序定义符号IPAD,只需:

#define  IPAD  1   

或者仅仅

#define IPAD

#ifndef  IPAD //检测如果没有定义IPAD,便定义IPAD
# define IPAD
#endif

(2)#if和 #elif预处理程序语句

#if预处理程序语句为控制条件编译提供了更通用的方法。if语句可以用来检测常量表达式是否为非零。如果表达式的结果为非零,就会处理到#else,#elif或#endif为止的所有后续,否则将跳过它们。

//定义预处理,检测当前系统版本
#define  IOS_VER  [[[UIDevice currentDevice] systemVersion] floatValue]

#if IOS_VER == 8.0
#define  _IPHONE_OS_8
#elif  IOS_VER == 7.0
#define  _IPHONE_OS_7
#endif
//根据当前版本做出相应的操作
#ifdef  _IPHONE_OS_8
        NSLog(@"ios8");
#elif defined _IPHONE_OS_7
        NSLog(@"ios7");
#else
        NSLog(@"ios6");
#endif

(3)#undef语句

在一些情况下,可能需要将一些已经定义的语句成为未定义的或对它们进行修改,使用 #undef语句就可以这么做。

#define  IPAD  1

取消 IPAD定义:

  #undef  IPAD

若要对IPAD进行修改就必修先取消在重新定义:

#ifdef  IPAD
	#if  IPAD  <  2
		#undef  IPAD
		#define  IPAD  2
	#endif
#endif








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值