参考博客

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

在C语言中,预处理代码是非常强大的工具,能让代码变得可读性和可维护性更强。预处理代码在代码编译之前被提前处理,预处理代码均由#打头。

1.#define基础应用——声明常量

格式:#define 常量名 代替值

#define声明主要用于将常量赋予有意义的名字,例如,声明表示一周天数的常量:

#define DAYS_WEEK 7
#define PI 3.1415

需要注意的几点:

* #define命令之后是常量名,再之后是代替值,之间用空格分隔,末尾没有分号。

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

* 一个被定义的常量名并不是一个变量;它的值一旦被定义,便不能再被改变。

#define 声明必须位于常量名使用之前(不像方法 (method) 可以放在文件中任意位置),一般位于本文件的顶部。

2.高级用法

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

#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));

* 多个参数:

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

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 的值。

Objective-C中#define的常见用法的更多相关文章

  1. Guava中Predicate的常见用法

    Guava中Predicate的常见用法 1.  Predicate基本用法 guava提供了许多利用Functions和Predicates来操作Collections的工具,一般在 Iterabl ...

  2. JAVA中enum的常见用法

    JAVA中enum的常见用法包括:定义并添加方法.switch.遍历.EnumSet.EnumMap 1.定义enum并添加或覆盖方法 public Interface Behaviour{ void ...

  3. Java中枚举的常见用法

    在JDK1.5以后引入了一种新的类型,就是枚举(enum).enum是用来声明枚举类型数据,它可以像数组一样存储许多的元素,但是不同于数组的是,它除了数字不能存储以外, 其他类型的如字母.特殊符号.汉 ...

  4. (转)轻松掌握shell编程中数组的常见用法及示例

    缘起:在老男孩进行linux培训shell编程教学中,发现不少水平不错的网友及同学对数组仍然很迷糊,下面就给大家分享下数组的用法小例子,希望能给大家一点帮助.其实SHELL的数组很简单,好用.我们学习 ...

  5. 转:VC中MessageBox的常见用法

    一.关于MessageBox       消息框是个很常用的控件,属性比较多,本文列出了它的一些常用方法,及指出了它的一些应用场合.       1.MessageBox("这是一个最简单的 ...

  6. VC中MessageBox的常见用法

    一.关于MessageBox       消息框是个很常用的控件,属性比较多,本文列出了它的一些常用方法,及指出了它的一些应用场合.       1.MessageBox("这是一个最简单的 ...

  7. K:java中枚举的常见用法

    用法一:常量   在JDK1.5 之前,我们定义常量都是: public static fianl.....现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. ...

  8. VC++中MessageBox的常见用法详解

    消息框是个很常用的控件,属性比较多,本文列出了它的一些常用方法,及指出了它的一些应用场合.         1.MessageBox("这是一个最简单的消息框!");        ...

  9. Objective-C中Block的常见用法

    typedef int(^AddValue)(int,int); int main(int argc, const char * argv[]) { @autoreleasepool { //1:NS ...

随机推荐

  1. apache 开启服务器包含(SSI)技术

    SSI(server-side includes)能帮我们实现什么功能: SSI提供了一种对现有HTML文档增加动态内容的方法,  即 在html中加入动态内容 SSI是嵌入HTML页面中的指令,在页 ...

  2. 转-Fragment+ViewPager组件(高仿微信界面)

    http://www.cnblogs.com/lichenwei/p/3982302.html 什么是ViewPager? 关于ViewPager的介绍和使用,在之前我写过一篇相关的文章<安卓开 ...

  3. Double-checked locking and the Singleton pattern--双重检查加锁失效原因剖析

    以下内容摘取自http://stackoverflow.com/questions/11195389/out-of-order-writes-for-double-checked-locking Th ...

  4. JAVA算数运算符

    算数运算符 序号 算数运算符 含义用法 特殊含义用法 1 + 加法 字符串连接 2 - 减法   3 * 乘法   4 / 除法   5 % 取余   实例: public class Test{ p ...

  5. 创建MySQL用户 赋予某指定库表的权限 flush privileges才能生效!!!!;@'localhost'授权本地,@'%'授权远程

    update ERROR 1364 (HY000): Field 'ssl_cipher' doesn't have a default value 建议使用GRANT语句进行授权,语句如下: gra ...

  6. Python标准库02 时间与日期 (time, datetime包)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python具有良好的时间和日期管理功能.实际上,计算机只会维护一个挂钟时间(wa ...

  7. OperationResult

    public class OperationResult<T> { private readonly ConcurrentDictionary<string, T> _valu ...

  8. linux内核设计与实现--从内核出发

    linux内核有两种版本:稳定的和处于开发中的. linux通过一种简单的命名机制来区分稳定的和处于开发中的内核,使用3个或者4个“.”分割的数字来代表不同内核版本. 如:2.6.26.1:第一个数字 ...

  9. [ActionScript 3.0] AS3.0 给flash事件传递参数的方法

    有时我们想要给flash内置的事件(比如MouseEvent)传递参数,这时我们可以用到下面的方法. import flash.events.MouseEvent; mc.addEventListen ...

  10. ELK stack elasticsearch/logstash/kibana 关系和介绍

    ELK stack elasticsearch 后续简称ES logstack 简称LS kibana 简称K 日志分析利器 elasticsearch 是索引集群系统 logstash 是日志归集集 ...