#define和预编译指令
今天再总结一点#define和预处理指令的使用。
预处理过程扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器。可见预处理过程先于编译器对源代码进行处理。
预处理指令是以#开头的代码行,#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符。正行语句构成了一条预处理指令,该指令酱紫啊编译器进行编译之前对源代码做某些转换,下面是一些常用的预处理指令,
# 空指令,没有任何效果
#include 包含一个源代码文件
#define 定义宏
#undef 取消定义宏
#if 如果条件为真,则编译下面的代码
#elif 如果前面的#if不为真,则编译下面的代码
#endif 结束一个#if...#elif条件编译块
#ifdef 如果已经定义了某个宏,则编译下面的代码
#ifndef 如果没有定义某个宏,则编译下面的代码
#error 停止编译并显示错误信息
最近在看公司自己封装的sdk的时候,遇到了很多#ifdef和#ifndef,下面我就主要距离来说一说这个预处理指令的灵活使用。比如你现在通过代码创建了一个Button,
UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btn.frame = CGRectMake(0, 0, 100, 40);
[btn setTitle:@"BUTTON" forState:UIControlStateNormal];
[btn addTarget:self action:@selector(btnClicked) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];
但是根据新的需求,这个Button暂时不需要显示在界面上面,这时候不可以将该Button相关的代码注释掉,这也不失为一个好方法。但是我更推荐使用预处理指令来进行条件判断,下面我使用两种方法来说明,
(1)第一种方法,定义一个具体的宏
#define Debug_ShowButton 0
{
//创建Button对象btn
......//省略若干代码
#if Debut_ShowButton
//如果需要显示按钮,那么将其添加到父视图中
[self.view addSubview:btn];
#else
//不将其添加到父视图中
//[self.view addSubview:btn];
#endif
}
这时候如果想显示该Button对象,那么将#define Debug_ShowButton 1,否则写为#define Debug_ShowButton 0。
(2)第二种方法,定义一个没有数值的宏
{
#ifdef Debug_ShowButton
[self.view addSubview:btn];
#endif
}
这段代码的意思就是如果定义了宏Debug_ShowButton,那么就将btn添加到父视图,如果没有定义的话,那么不添加到父视图。这时候如果我们想要将其添加到父视图,则在文件的顶部写上#define Debug_ShowButton,对,这时候我们可以不给这个宏指定对应的值,这个代码仅仅表示定义一个没有对应值的宏。
总结:
这两种方法,我更加推荐第二种,因为一般情况下,我们定义一个有对应数值的宏,是为了在代码中使用该数值,例如#define
kStatusBarHieght
20,这样我们就可以把kStatusBarHeight作为数值在代码中使用,而第一种方法定义了有对应值的宏Debug_ShowButton,我们却没有在代码中使用它,这样是不是有点浪费呢;而使用第二种方法定义一个没有对应值的宏,它只是一个标识符,看起来简单点。我个人更加推荐第二种!
#define和预编译指令的更多相关文章
- iOS中的预编译指令的初步探究
目录 文件包含 #include #include_next #import 宏定义 #define #undef 条件编译 #if #else #endif #if define #ifdef #i ...
- C/C++中的预编译指令
工作中遇到的: 一个头文件中的: #pragma warning(disable:4996)#pragma warning(disable:4244)#pragma warning(disable:4 ...
- C#预编译指令
近日工作涉及到于外部系统交互,对方提供接口:但是在双方系统未联调时,引用外部DLL,相关类实例化,提示异常错误(错误消息正常):后面操作无法进行,那如何写调试代码,即在调试时不运行某段代码,而在正式发 ...
- C:预编译指令
预编译 关于编译 参考 关于宏定义 参考 预编译又称为预处理,是做些代码文本的替换工作处理#开头的指令,比如拷贝#include包含的文件代码,#define宏定义的替换,条件编译等,就是为编译做的预 ...
- C#中的预编译指令介绍
原文:C#中的预编译指令介绍 1.#define和#undef 用法: #define DEBUG #undef DEBUG #define告诉编译器,我定义了一个DEBUG的一个符号,他类似一个变量 ...
- C++ 内置宏定义 与 预编译指令
内置宏和预编译指令, 在代码调试.单元测试.跨平台代码中经常会用到.这里记录一下. 1. 内置宏 (文件名,当前行号,当前日期,当前时间,当前执行方法名) __FILE____LINE____DATE ...
- c语言中条件编译相关的预编译指令
一. 内容概述 本文主要介绍c语言中条件编译相关的预编译指令,包括#define.#undef.#ifdef.#ifndef.#if.#elif.#else.#endif.defined. 二.条件编 ...
- C#编写中使用预编译指令代替不停的注释
是不是经常调试某个模块的时候,要打开一堆Console或者Debug.Log,printf 不调试的时候,又关掉.如此繁复的倒腾实在是烦 可以使用预编译指令代替这种做法 #define 自定义字段 . ...
- c/c++中的预编译指令总结
预处理指令提供按条件跳过源文件中的节.报告错误和警告条件,以及描绘源代码的不同区域的能力.使用术语“预处理指令”只是为了与 C 和 C++ 编程语言保持一致.在 C# 中没有单独的预处理步骤:预处理指 ...
随机推荐
- Compass 编译.scss文件的问题
compass 命令编译scss文件存在一个问题: 不能对"_"下划线开头的scss文件名称的文件进行编译.将"_"去掉就可以啦
- 图片处理 Pillow
Pillow 在python3下用PIL做图像处理 Python图像处理库:Pillow 初级教程 from PIL import Image im = Image.open('22.gif') pr ...
- JPA简单知识
,JPA(Java Persistence API):通过注解或XML描述对象--关系表的映射关系,并将运行期的实体对象持久化到数据库中. JPA是一套规范,不是某个ORM产品,它主要包括以下3方面的 ...
- POJ 1258 Agri-Net
题意:给一个无向图的邻接矩阵,求最小生成树. 解法:Kruskal算法.把边按边权排序,从小到大插入生成树中,如果一个边的两个点都在生成树中则不插入,用并查集维护. 代码: #include<s ...
- HDU 5688 Problem D
Problem D Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
- 扩展类加载器-------改变JAVA的父优先类加载顺序
java的类加载机制默认情况下是采用委托模型:当加载某个类时JVM会首先尝试用当前类加载器的父类加载器加载该类,若父类加载器加载不到再由当前类加载器来加载,因此这种模型又叫做“父优先”模型. 但是在实 ...
- Codeforces 611C New Year and Domino DP+容斥
"#"代表不能放骨牌的地方,"."是可以放 500*500的矩阵,q次询问 开两个dp数组,a,b,a统计横着放的方案数,b表示竖着放,然后询问时O(1)的,容 ...
- JS兼容性处理
百度 - 终端适配API 适合服务器端使用.POST客户端传递的http头信息越多,得到的适配信息越准确.百度返回的数据为: 正确情况: { device_type :/*1:手机2:pc*/ os: ...
- 【opencv】图像细化
[原文:http://blog.csdn.net/qianchenglenger/article/details/19332011] 在我们进行图像处理的时候,有可能需要对图像进行细化,提取出图像的骨 ...
- uvalive 4513 Stammering Aliens
题意:给你一个串,问期中至少出现m次的最长子串及其起始位置的坐标. 思路:hash+LCP+二分答案 #include<cstdio> #include<cstring> #i ...