今天再总结一点#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和预编译指令的更多相关文章

  1. iOS中的预编译指令的初步探究

    目录 文件包含 #include #include_next #import 宏定义 #define #undef 条件编译 #if #else #endif #if define #ifdef #i ...

  2. C/C++中的预编译指令

    工作中遇到的: 一个头文件中的: #pragma warning(disable:4996)#pragma warning(disable:4244)#pragma warning(disable:4 ...

  3. C#预编译指令

    近日工作涉及到于外部系统交互,对方提供接口:但是在双方系统未联调时,引用外部DLL,相关类实例化,提示异常错误(错误消息正常):后面操作无法进行,那如何写调试代码,即在调试时不运行某段代码,而在正式发 ...

  4. C:预编译指令

    预编译 关于编译 参考 关于宏定义 参考 预编译又称为预处理,是做些代码文本的替换工作处理#开头的指令,比如拷贝#include包含的文件代码,#define宏定义的替换,条件编译等,就是为编译做的预 ...

  5. C#中的预编译指令介绍

    原文:C#中的预编译指令介绍 1.#define和#undef 用法: #define DEBUG #undef DEBUG #define告诉编译器,我定义了一个DEBUG的一个符号,他类似一个变量 ...

  6. C++ 内置宏定义 与 预编译指令

    内置宏和预编译指令, 在代码调试.单元测试.跨平台代码中经常会用到.这里记录一下. 1. 内置宏 (文件名,当前行号,当前日期,当前时间,当前执行方法名) __FILE____LINE____DATE ...

  7. c语言中条件编译相关的预编译指令

    一. 内容概述 本文主要介绍c语言中条件编译相关的预编译指令,包括#define.#undef.#ifdef.#ifndef.#if.#elif.#else.#endif.defined. 二.条件编 ...

  8. C#编写中使用预编译指令代替不停的注释

    是不是经常调试某个模块的时候,要打开一堆Console或者Debug.Log,printf 不调试的时候,又关掉.如此繁复的倒腾实在是烦 可以使用预编译指令代替这种做法 #define 自定义字段 . ...

  9. c/c++中的预编译指令总结

    预处理指令提供按条件跳过源文件中的节.报告错误和警告条件,以及描绘源代码的不同区域的能力.使用术语“预处理指令”只是为了与 C 和 C++ 编程语言保持一致.在 C# 中没有单独的预处理步骤:预处理指 ...

随机推荐

  1. [转] web.xml文件详解

    转自:http://www.cnblogs.com/hellojava/archive/2012/12/28/2835730.html 前言:一般的web工程中都会用到web.xml,web.xml主 ...

  2. HTTP编程(六)

    此为网络编程的一个系列,后续会把内容补上.....

  3. Imageview使用记录

    1. imageView清除背景 原文网址:http://blog.csdn.net/lzq1039602600/article/details/40393591 两种清除 imageView的背景 ...

  4. @Html.Partial,@Html.Action,@Html.RenderPartial,@Html.RenderAction区别 .(转)

    mvc renderaction   renderpartial  杂谈      Html.RenderPartial与Html.RenderAction这两个方法都是用来在界面上嵌入用户控件的. ...

  5. NFA和DFA区别

    一个数据块的访问时间等于寻道时间.旋转延迟时间和数据传输时间三者之和: NFA和DFA区别: 一个状态如A,遇0可以转换到下一个状态B或C,因为选择多所以不确定,因此为不确定的有限自动机: 一个状态还 ...

  6. SharePoint 2010 master page 控件介绍(3) :页面主体内容

    转:http://blog.csdn.net/lgm97/article/details/6409217 <!-- =====  页面滚动区域开始  ====================== ...

  7. java jvm学习笔记七(jar包的代码认证和签名)

    欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 前言: 如果你循序渐进的看到这里,那么说明你的毅力提高了,jvm的很多东西都是比较抽像的,如果不找相对应的代码来辅助理解 ...

  8. HDU4289 Control 最大流

    经典题,求去掉若干个点,使得两个点不在连通,总价值最少 所以拆点最小割,除了拆点边,流量都为无穷,拆点边是流量为价值 #include <iostream> #include <cs ...

  9. puppet学习:类与类的依赖关系的问题

    今天在部署Zabbix的Proxy时,在负责安装的Exec中去掉了一些无关的Package的依赖,结果,就出现了依赖关系的问题. 在zabbix::install中,我写的是require mysql ...

  10. SimpleHttpServer的学习之总体架构

    http://www.cnblogs.com/hansongjiang/p/4213491.html 从代码中我们看到SimpleHttpServer这个类直接依赖4个类,但是最重要的类,当属其属性, ...