在开发中,会经常遇到申明全局变量的问题,而在Objective-C中,声明全局变量主要有#define、const、extern、FOUNDATION_EXPORT这四种,这篇文章主要讲#define的常见用法和解析,后面几种会在接下来的文章讲解。
在讲#define之前,得先了解下什么叫预处理代码(Preprocessor)。
一、预处理代码(Preprocessor)
预处理代码,即在代码编译之前就被提前处理,这在C语言中,是一个非常强大的工具。利用预处理代码,可以重新定义代码的一部分,使得代码更适合自己的风(逼)格。预处理代码均由一个井号(#)开头。

二、定义常量或字符串
格式:#define 常量名 替代值
例如:#define HOURS_PER_DAY 24 #define AND &&
说明:
1、习惯将常量名全大写,单词之间用下划线隔开,方便与正常变量区分。
2、常量名和替代值中间必须有空格,而替代值后面不能加分号(;),因为在编译处理器处理#define代码时,会自动寻找空格,空格之后的被认为替代值,如果加了分号,分号本身也会被认为是替代值的一部分。
3、一个被定义的常量名并不是一个变量,它的值一旦被定义,便不能再被改变。
4、#define 声明通常位于一个文件的顶部,紧跟在#import 文件导入定义之后,同时,必须位于常量名使用之前。
三、带参数的定义—宏
例如:
#define SQUARE(x) ( (x) * (x) )
此时, y = SQUARE( V + 1) , 等价于 y = ( (v + 1) * (v + 1) )
#define CalcInterest(x, y) ( (x) * (y) )
代码即可这样书写 int result = CalcInterest(10, 5)
#define RGBA(r, g, b, a) [UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:a]
代码即可这样书写 self.view.backgroundColor = RGBA(100, 200, 185, 1.0);
#define Array(FIRST, …) [NSArray arrayWithObjects: FIRST, ##VA_ARGS, nil]
其中##VA_ARGS用于表示省略号所代表的所有内容,此时NSLog(@”%@”,Array(@”100”, @”200”));// 输出(100, 200)
说明: 1~4同定义常量或字符串相同。

四、带#算符或者##算符
1、#算符可产生一个C语言格式的字符串。
例如:#define string(x)#x
此时NSLog(@”%s”, string(testing)); // 输出为testing,注意,C语言格式的字符串需要用%s,不能用%@

2、##算符用来连接两段字符串
例如上面的##VA_ARGS,它可用来抓取省略号所代表的所有内容

五、定义函数
例如:#define MJCodingImplementation \
- (id)initWithCoder:(NSCoder *)decoder \
{ \
if (self = [super init]) { \
[self decode:decoder]; \
} \
return self; \
} \
\
- (void)encodeWithCoder:(NSCoder *)encoder \
{ \
[self encode:encoder]; \
}

#define 用法解析相关推荐

  1. extern c用法解析

    extern "c"用法解析 字数1875 阅读38631 评论4 喜欢20 引言 C++保留了一部分过程式语言的特点,因而它可以定义不属于任何类的全局变量和函数.但是,C++毕竟 ...

  2. extern C的用法解析

    extern "C"的用法解析 2012-03-20 23:29 by Rollen Holt, 20231 阅读, 6 评论, 收藏, 编辑 1.引言 C++语言的创建初衷是&q ...

  3. scipy.optimize.curve_fit函数用法解析

    scipy.optimize.curve_fit函数用法解析 转:https://zhuanlan.zhihu.com/p/144353126 optimize.curve_fit()函数,用于日常数 ...

  4. 四种Java线程池用法解析

    四种Java线程池用法解析 本文为大家分析四种Java线程池用法,供大家参考,具体内容如下 http://www.jb51.net/article/81843.htm 1.new Thread的弊端 ...

  5. #define 用法

    #define用法 收藏 1.简单的define定义 #define MAXTIME 1000 一个简单的MAXTIME就定义好了,它代表1000,如果在程序里面写 if(i<MAXTIME){ ...

  6. mysql have_mysql having用法解析

    having的用法 having字句可以让我们筛选成组后的各种数据,where字句在聚合前先筛选记录,也就是说作用在group by和having字句前.而 having子句在聚合后对组记录进行筛选. ...

  7. argparse.ArgumentParser()用法解析

    argparse.ArgumentParser()用法解析(https://blog.csdn.net/the_time_runner/article/details/97941409) https: ...

  8. sql中group by 和having 用法解析

    --sql中的group by 用法解析: -- Group By语句从英文的字面意义上理解就是"根据(by)一定的规则进行分组(Group)". --它的作用是通过一定的规则将一 ...

  9. C:#define用法

    #define用法 C语言中,可以用 #define 定义一个标识符来表示一个常量. 其特点是:定义的标识符不占内存,只是一个临时的符号,预编译后这个符号就不存在了. 预编译又叫预处理.预编译不是编译 ...

最新文章

  1. GitHub开源的AI下五子棋(基于博弈树极大极小值alpha-beta剪枝搜索)
  2. 如何让vue项目打包出来之后更加小巧?
  3. C++编程练习(5)----“实现简单的循环队列的顺序存储结构“
  4. AtomicIntegerArray和AtomicIntegerFieldUpdater
  5. java实现关键词云_Java synchronized 关键词详细说明
  6. 《C++ Primer》第一章的 Sales_item.h头文件源码
  7. springmvc 1
  8. 接口向mapper传参数
  9. 2018-2019-2 20165234 《网络对抗技术》 Exp2 后门原理与实践
  10. maven中常遇到的一些错误
  11. python-31:然而我发现结果并不是我想要的
  12. 不透水面提取操作实现
  13. 【TSP】基于matlab GUI蚁群算法求解旅行商问题【含Matlab源码 929期】
  14. 推荐几个Linux镜像下载网站
  15. 【BAT】win10 命令行工具cmd乱码解决方案及cmd非常用命令chcp介绍
  16. 条码软件如何将标签文件输出为PDF文档
  17. js判断上传文件为图片格式、excel格式
  18. 一个三非渣本的安卓秋招之路
  19. Windows 2016 服务器安全配置和加固
  20. 在Vmware14中安装Linux系统教程(图文教程)

热门文章

  1. 设计模式之模板方法模式在kafka DelayedOperation中的应用
  2. 杰理之soft off和powerdown唤醒后如何获取唤醒源?【篇】
  3. 百度、腾讯和阿里巴巴 12大隐藏良心级实用功能
  4. 在虚拟机Virtual box搭建linux环境
  5. mysql(Mariadb)
  6. mariadb(mysql)[详解]
  7. Arduino+DHT11温湿度传感器+12864oled显示温湿度
  8. HTML 视频播放代码
  9. 深圳将在2015年推广家庭服务机器人
  10. spring cloud系列一:Cloud Native Applications