Objective-C基础—预处理程序
2014-11-05 09:53
274 查看
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
下面定义了检测字符是不是小写的宏:
#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
(3)#undef语句
在一些情况下,可能需要将一些已经定义的语句成为未定义的或对它们进行修改,使用 #undef语句就可以这么做。
#define IPAD 1
取消 IPAD定义:
#undef IPAD
若要对IPAD进行修改就必修先取消在重新定义:
#ifdef IPAD
#if IPAD < 2
#undef IPAD
#define IPAD 2
#endif
#endif
#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
相关文章推荐
- Xcode基础:详解Objective-C开发带有图形界面的程序
- objective-C [预处理程序]
- Objective - C基础: 第一天 - 1. 第1, 2个OC程序
- 黑马程序员——IOS基础---Objective-C第一节课---最简单的OC程序
- Objective-C基础学习笔记(一)-程序整体语法结构
- Objective-C预处理程序
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第十二章 预处理程序
- Objective-C基础笔记(1)基本概念和第一个程序
- Objective-C基础笔记(1)基本概念和第一个程序
- 黑马程序员---objective-c基础学习--第一个oc程序及代码分析
- c++基础11:变量的命名约定 头文件的问题 程序的预处理编译链接过程
- 预处理程序Objective-C之成魔之路
- Objective-C之成魔之路【13-预处理程序】
- 黑马程序员——Objective-C程序设计(第4版)学习笔记之12-预处理程序——黑马 IOS 技术博客
- 预处理程序Objective-C之成魔之路
- C++---基础篇(预处理程序指令)
- Objective-C之成魔之路【13-预处理程序】
- 预处理程序Objective-C之成魔之路
- 黑马程序员——Objective-C基础——简单的OC程序
- iOS开发笔记系列-基础6(预处理程序)