Objective-C #define 用法解析 (转)

原文地址:

http://blog.csdn.net/kindazrael/article/details/8108868

Objective-C : #define 用法解析

在 C 语言中,预处理代码 (Preprocessor)
是非常强大的工具,能让你的代码变得更加易读和易改。利用预处理代码,你可以重新定义代码的一部分,使得你的代码更适合你的风格。预处理代码
(Preprocessor) 在代码编译之前被提前处理。预处理代码均由一个井号 (#) 打头。

1. 关于 #define

#define 声明主要用于将常量(或字符串)赋予有意义的名字,比如当你在编写一个日历程序时,可以定义:

#define MONTHS_PER_YEAR 12

请注意格式。#define 命令之后为常量名,再之后为所赋的代替值,用空格隔开,结尾不需分号。

#define 常量名 代替值

通常情况下,习惯将预处理的常量名全大写,单词之间用下划线隔开(与正常变量区分)。这样做的原因是在编译器处理这段 #define 代码时,会自动寻找空格,空格之后的被认为是代替值。这也是为什么在每一行代码的末尾不用加分号的原因,因为如果加了分号,分号本身也会被认为是代替值的一部分。

一个被定义的常量名并不是一个变量;它的值一旦被定义,便不能再被改变。 #define 声明通常位于一个文件的顶部,紧接在 #import 文件导入定义之后。需要注意的是, #define 声明必须位于常量名使用之前(不像方法
(method) 可以放在文件中任意位置)。

使用 #define 的另一个例子是储存一些有意义的数值, 比如

#define PI 3.141592654
// 计算圆的面积使用 "PI * radius * radius" 即可

,这比处处书写 3.141592654 要方便许多。(改起来也快很多)

2. 更高级的用途

注意,预处理代码起的作用实际上相当于在编译之前,在整个代码中进行了一次“搜索、替换”功能。这意味着 #define 有许多更复杂、更高级的用途。

我们先从 2π 开始,将 TWO_PI 定义为 2π:

#define TWO_PI 2.0 * 3.141592645

由于我们之前曾定义过 π,我们同样可以在定义中使用定义后的常量名来指代:

#define TWO_PI 2.0 * PI

除了常量以外,你还可以利用预处理定义 Objective-C 代码中任意一段字符或字符串,例如:

#define AND &&
#define OR ||
#define EQUALS ==

if (y EQUALS 0 OR y EQUALS 1) // …

合理地利用 #define,可增强代码的可读性。对比下列两行代码:

if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))

// 或

#define IS_LEAP_YEAR (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)
if (IS_LEAP_YEAR) // 代码可读性更强。

一个定义通常应在一行代码中完成。但如果你需要手动空行,那么在每行后输入一个后划线(\)即可将几行代码连接起来成为一行。例如:

#define IS_LEAP_YEAR(y) (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0)

if ( IS_LEAP_YEAR(currentYear) )

3. 宏


#define 声明中还可以使用参数,并且可使用多个参数;这一特性被称为“宏”:

如:

#define SQUARE(x) ( (x) * (x) )

此时, y = SQUARE(v + 1); 等价于 y = ( (v + 1) *
(v + 1) );

两个参数

例如,你可以定义:

#define CalcInterest(x,y) ( x * y )

代码中便可书写:

int earnings = CalcInterest(10,5));

多个参数


例如,在代码中,你需要频繁使用 [NSArray arrayWithObjects: object, ...,
nil]
 这一命令。利用#define,你可以简化代码:

#define Array(FIRST, ...) [NSArray arrayWithObjects: FIRST, ##__VA_ARGS__, nil]

其中 ##__VA_ARGS__ 用于表示省略号所代表的所有内容。

4. # 算符以及 ## 算符

# 算符可产生一个 C-语言 格式的字符串。如:

#define string(x) #x //则 string(testing) == "testing"

##
算符用来连接两段字符串。假设你有一组变量,x1 到 x100。如果你想打印其中某一个变量的值。你可以这样定义:

#define printxvar(n) printf("%i\n", x ## n)

由此, printxvar(20); 在编译时将被识别为 printf(“%i\n”,
x20);
。这样只需要输入 printxvar(n);便可以打印出 xn 的值。

其实,##最常用的用途还是上面介绍的 ##__VA_ARGS__,它可用来抓取省略号所代表的所有内容。

Objective-C #define 用法解析 (转),布布扣,bubuko.com

时间: 2024-10-27 06:17:44

Objective-C #define 用法解析 (转)的相关文章

Objective-C : #define 用法解析

原文地址: http://blog.csdn.net/kindazrael/article/details/8108868 在 C 语言中,预处理代码 (Preprocessor) 是非常强大的工具,能让你的代码变得更加易读和易改.利用预处理代码,你可以重新定义代码的一部分,使得你的代码更适合你的风格.预处理代码 (Preprocessor) 在代码编译之前被提前处理.预处理代码均由一个井号 (#) 打头. 1. 关于 #define #define 声明主要用于将常量(或字符串)赋予有意义的名

extern "c"用法解析

转自: extern "c"用法解析 - 简书 引言 C++保留了一部分过程式语言的特点,因而它可以定义不属于任何类的全局变量和函数.但是,C++毕竟是一种面向对象的程序设计语言,为了支持函数的重载,C++对全局函数的处理方式与C有明显的不同.extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码.加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的.由于C++支持函数重载,因此编译器编译函

extern "C" 用法解析

extern "c"用法解析 作者 作者Jason Ding ,链接http://www.jianshu.com/p/5d2eeeb93590 引言 C++保留了一部分过程式语言的特点,因而它可以定义不属于任何类的全局变量和函数.但是,C++毕竟是一种面向对象的程序设计语言,为了支持函数的重载,C++对全局函数的处理方式与C有明显的不同.extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码.加上extern "C"后,会

C/C++之extern "C"的用法解析

extern "C"的用法解析 http://blog.sina.com.cn/u/494a1ebc010004g5 C++中extern “C”含义深层探索 1.引言 C++语言的创建初衷是“a better C”,但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同.作为一种欲与C兼容的语言,C++保留了一部分过程式语言的特点(被世人称为“不彻底地面向对象”),因而它可以定义不属于任何类的全局变量和函数.但是,C++毕竟是一种面向对象的程序设计语

sql中的group by 和 having 用法解析

--sql中的group by 用法解析:-- Group By语句从英文的字面意义上理解就是“根据(by)一定的规则进行分组(Group)”.--它的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对若干个小区域进行数据处理.--注意:group by 是先排序后分组:--举例子说明:如果要用到group by 一般用到的就是“每这个字” 例如说明现在有一个这样的表:每个部门有多少人 就要用到分组的技术select DepartmentID as '部门名称',COUNT(*) a

++和+的运算优先级和++i和i++混合用法解析

近日碰到一个技术交流的地方,发现出了一道基础知识的题,刚一看题目确实有点晕,仔细分析如下: int i = 5; int k = i+++(++i)+(++i);           也可以写成(i++)+(++i)+(++i) 其实这个是k=(5++)+(++6)+(++7)=5+7+8=20 得出结果为20 ++和+的运算优先级和++i和i++混合用法解析,布布扣,bubuko.com

WordPress的have_posts()和the_post()用法解析

原文地址:http://www.phpvar.com/archives/2316.html 网上找到一篇介绍WordPress的have_posts()和the_post()用法解析的文章,觉得不错! 在WordPress的index.php文章循环输出中,通常会有下面一段代码: <?php if (have_posts()) : ?> <?php while (have_posts()) : the_post(); ?> <!–PHP代码 –> <?php en

最全面的Java多线程用法解析

最全面的java多线程用法解析,如果你对Java的多线程机制并没有深入的研究,那么本文可以帮助你更透彻地理解Java多线程的原理以及使用方法. 1.创建线程 在Java中创建线程有两种方法:使用Thread类和使用Runnable接口.在使用Runnable接口时需要建立一个Thread实例.因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例.Thread构造函数: public Thread( ); public Thread(Runnab

mybatis源码追踪1——Mapper方法用法解析

Mapper中的方法执行时会构造为org.apache.ibatis.binding.MapperMethod$MethodSignature对象,从该类源码中可以了解如何使用Mapper方法. [支持的特殊参数类型] RowBounds.ResultHandler.普通参数 (作为sql执行时使用的变量) 其中普通参数可以是单一的model.查询条件的map或直接将一到多个查询条件作为参数(多个条件在框架中最终将封装为map使用) 另外普通参数支持添加@Param注解以修改参数名,如不修改则参