Objective-C中#define的常见用法
参考博客
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的常见用法的更多相关文章
- Guava中Predicate的常见用法
Guava中Predicate的常见用法 1. Predicate基本用法 guava提供了许多利用Functions和Predicates来操作Collections的工具,一般在 Iterabl ...
- JAVA中enum的常见用法
JAVA中enum的常见用法包括:定义并添加方法.switch.遍历.EnumSet.EnumMap 1.定义enum并添加或覆盖方法 public Interface Behaviour{ void ...
- Java中枚举的常见用法
在JDK1.5以后引入了一种新的类型,就是枚举(enum).enum是用来声明枚举类型数据,它可以像数组一样存储许多的元素,但是不同于数组的是,它除了数字不能存储以外, 其他类型的如字母.特殊符号.汉 ...
- (转)轻松掌握shell编程中数组的常见用法及示例
缘起:在老男孩进行linux培训shell编程教学中,发现不少水平不错的网友及同学对数组仍然很迷糊,下面就给大家分享下数组的用法小例子,希望能给大家一点帮助.其实SHELL的数组很简单,好用.我们学习 ...
- 转:VC中MessageBox的常见用法
一.关于MessageBox 消息框是个很常用的控件,属性比较多,本文列出了它的一些常用方法,及指出了它的一些应用场合. 1.MessageBox("这是一个最简单的 ...
- VC中MessageBox的常见用法
一.关于MessageBox 消息框是个很常用的控件,属性比较多,本文列出了它的一些常用方法,及指出了它的一些应用场合. 1.MessageBox("这是一个最简单的 ...
- K:java中枚举的常见用法
用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.....现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. ...
- VC++中MessageBox的常见用法详解
消息框是个很常用的控件,属性比较多,本文列出了它的一些常用方法,及指出了它的一些应用场合. 1.MessageBox("这是一个最简单的消息框!"); ...
- Objective-C中Block的常见用法
typedef int(^AddValue)(int,int); int main(int argc, const char * argv[]) { @autoreleasepool { //1:NS ...
随机推荐
- hdu 5438 Ponds dfs
Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Problem Descr ...
- python(6)时间戳和北京时间互转,输出当前的时间和推到七天前的日期
项目发展的需要:(包含时间函数)time datetime 时间戳和北京时间互转 import time import datetime s = '2015-04-17 11:25:30' d = d ...
- 配置cwrsync实现windows2008和centos7文件定时同步
一.准备 二.安装 1.安装cwRsyncServer_4.0.5_Installer.exe 安装过程中提示创建用于windows服务的windows用户名,需要注意的是密码一定要它自己生成的密码的 ...
- JAVA 单选按钮、复选按钮
//单选按钮和复选按钮 import java.awt.*; import javax.swing.*; public class Jiemian6 extends JFrame{ JPanel mb ...
- Beautiful Soup第三方爬虫插件
什么是BeautifulSoup? Beautiful Soup 是用Python写的一个HTML/XML的解析器,它可以很好的处理不规范标记并生成剖析树(parse tree). 它提供简单又常用的 ...
- php启动时候提示PHP startup的解决方法
最近在学习php,配置好php环境后,每次开机都有警告提示说 PHP startup.如下图: 显然这是个小问题,是关于php配置的. 解决这个问题很简单只需要在php.ini 文件中修改 exten ...
- 设置Linux下Mysql表名不区分大小写
1.Linux下mysql安装完后是默认:区分表名的大小写,不区分列名的大小写:2.用root帐号登录后,在/etc/my.cnf中的[mysqld]后添加添加lower_case_table_nam ...
- editplus格式化xml文档
使用editplus打开xml文档,发现文件内容没有格式化,非常难看,使用IE9打开这个xml文档是格式化的,但是IE9打开不能编辑. 在网上找了一些资料发现能够通过一个小插件来是editplus格式 ...
- Ext 项目随笔
region: This region's layout position (north, south, east, west or center). Read-only. collapsible:t ...
- POJ题目分类(转)
初期:一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. (4)递推. ...