oc温习六:预处理指令
预处理:分析程序前先处理的语句,它可以识别散布在程序中的特定语句。所有的预处理语句都适用“#”开头,这个符号必须是一行中的第一个非空字符。
预处理可以大概分为三类:文件包含、宏定义和条件编译。
1.文件包含
文件包含:在当前文件中用到其它文件中的函数或方法或其它信息时,可以将其它文件的头文件包含进来,然后再当前文件中使用,文件包含一般放到文件的开头。
如果使用C语言编程,文件包含是#include<> 或者 #include ""。如果使用Objective-C语言,文件包含为#import<>或者#import ""。#include 和 #import最大的区别是 #import 在导入文件的时候进行了去重复检查,此外,""和<>两也是有区别的,""一般是用来引用自定义的文件,<>一般是用来引用系统的文件。程序在执行的时候,会根据你写的样式,优先去寻找对应类型的文件。比如<>会先去找系统文件,如果找不到,再去找自定义文件。所以正确的选择样式,能够提高程序的执行效率。
循环引用:在使用文件包含的时候,会遇到A文件中用到B文件,B文件中用到A文件,这种互相使用包含的关系就有点类似死循环了,运行的时候就是报错。解决这个问题最好的办法就是用@class代替文件包含,@class就是表明有这个类,等在源文件中真正用到的时候才会去包含文件。
2.宏定义
在程序中,有一些常量或者简短的函数是会被多次重复调用的,对于这些常用的数据,我们可以使用宏定义。使用宏定义可以快速的完成程序中的多处配置,最大的好处就是只要修改宏定义的值,所有使用宏定义的值都会发生改变。此外,宏定义是在程序编译之前进行替换和设置,比定义成全局变量或者函数的效率要高。
宏定义是通过#define来实现的,一般写在程序文件包含的下面。宏名通常用全部的大写字母表示,下面,就通过代码来看一下宏定义的使用。
3.条件编译
条件编译:在编译之前由预处理器来根据处理语句进行判断,如果满足条件,就编译满足条件下的代码。反之就不进入编译环节。
Xcode预处理命令:
#define 定义一个预处理宏
#undef 取消宏的定义
#include 包含文件命令
#include_next 与#include相似, 但它有着特殊的用途
#if 编译预处理中的条件命令, 相当于C语法中的if语句
#ifdef 判断某个宏是否被定义, 若已定义, 执行随后的语句
#ifndef 与#ifdef相反, 判断某个宏是否未被定义
#elif 若#if, #ifdef, #ifndef或前面的#elif条件不满足, 则执行#elif之后的语句, 相当于C语法中的else-if
#else 与#if, #ifdef, #ifndef对应, 若这些条件不满足, 则执行#else之后的语句, 相当于C语法中的else
#endif #if, #ifdef, #ifndef这些条件命令的结束标志.
defined 与#if, #elif配合使用, 判断某个宏是否被定义
#line 标志该语句所在的行号
# 将宏参数替代为以参数值为内容的字符窜常量
## 将两个相邻的标记(token)连接为一个单独的标记
#pragma 说明编译器信息#warning 显示编译警告信息
#error 显示编译错误信息
参考文献:http://www.jianshu.com/p/4a133c651265
oc温习六:预处理指令的更多相关文章
- (C/C++学习笔记) 十六. 预处理
十六. 预处理 ● 关键字typeof 作用: 为一个已有的数据类型起一个或多个别名(alias), 从而增加了代码的可读性. typedef known_type_name new_type_nam ...
- C开发系列-预处理指令
简介 OC程序执行过程,在源代码编译成0跟1的二进制文件之前.执行的指令称之为预处理指令. 所有的预处理指令都是以#开头.#import也是预处理指令.预处理指令主要分为三种 宏定义 条件编译 文件包 ...
- 预处理指令#pragma
#pragma介绍 #pragma是一个预处理指令,pragma的中文意思是『编译指示』.它不是Objective-C中独有的东西(貌似在C/C++中使用比较多),最开始的设计初衷是为了保证代码在不同 ...
- C/C++预处理指令#define,#ifdef,#ifndef,#endif…
2016年12月29日更新: 今天查看以前文件的时候, 突然发现了#error 这个预处理指令.然后回想一下工作, 发现这个指令使用场景还是很多的.比如: 一个项目的模块儿之多,源文件之大,代码之多, ...
- Effective Objective-C 2.0 — 第四条:多用类型常量,少用#define预处理指令
第四条:多用类型常量,少用#define预处理指令 使用#define 预处理的坏处:定义出来的常量没有类型信息,编译器只是会在编译前据此执行查找与替换操作.即使有人重新定义了常量值,编译器也不会产生 ...
- VC中预处理指令与宏定义详解
刚接触到MFC编程的人往往会被MFC 向导生成的各种宏定义和预处理指令所吓倒,但是预处理和宏定义又是C语言的一个强大工具.使用它们可以进行简单的源代码控制,版本控制,预警或者完成一些特殊的功能. 一个 ...
- C#中的预处理指令
C#中的预处理指令 作为预处理中的一对:#region name ,#endregion可能是大家使用得最多的,我也常用它来进行代码分块,在一个比较长的cs文件中,这么做确实是一件可以让你使代码更清晰 ...
- C#学习笔记(十五):预处理指令
C#和C/C++一样,也支持预处理指令,下面我们来看看C#中的预处理指令. #region 代码折叠功能,配合#endregion使用,如下: 点击后如下: 条件预处理 条件预处理可以根据给出的条件决 ...
- iOS预处理指令
预处理过程扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器.可见预处理过程先于编译器对源代码进行处理. 预处理指令是以#开头的代码行,#后是指令关键字,在关键字和#号之间允许存在任意个数的空 ...
随机推荐
- android动画之通过子线程来实现动画
android动画之通过子线程来实现动画 使用android动画机制,往往是相对于原始位置来进行参照. 这里通过子线程修改物体位置实现动画. 布局文件: <RelativeLayout xmln ...
- Python3 写入文件
Demo: file = open("test.txt", "wb")file.write("string") 上面这段代码运行会报类型错误 ...
- 问题处理:Cannot find module (SNMPv2-TC): At line 10 in /usr/share/snmp/mibs/UCD-DLMOD-MIB.txt
在执行 php -i |grep redis 时显示以下报错信息(但在phpinfo查看时一切正常): MIB search path: /root/.snmp/mibs:/usr/share/sn ...
- vue项目中快捷语法糖
1.Vue.js是渐进式框架,采用自底向上增量开发的设计基于MVVM思想. 2.Vue 完全有能力驱动采用单文件组件和Vue生态系统支持的库开发的复杂单页应用. 3.Vue.js 的目标是通过尽可能简 ...
- 固定table表头
<style> #box{ height:214px; width:500px; overflow-y:auto;/** 必须,否则当表格数据过多时,不会产生滚动条,而是自动延长该div的 ...
- Android(java)学习笔记163:开发一个多界面的应用程序之界面间数据传递
1.界面跳转的数据传递 (1)intent.setData() --> intent.getData(): 传递的数据比较简单,一般是文本类型的数据String:倘若我们传递的数据比较复 ...
- css3 calc()属性介绍以及自适应布局使用方法
前端知识 Calc()介绍 calc的英文是calculate的缩写,中文为计算的意思,是css3的一个新增的功能,用来只当元素的长度.比如说:你可以用calc()给元素margin.padding. ...
- docker存储管理
Docker 镜像的元数据 repository元数据 repository在本地的持久化文件存放于/var/lib/docker/image/overlay2/repositories.json中 ...
- while循环(break、continue)
while循环 流程:判断条件是否为真,如果条件为真,执行代码块,然后再次判断条件是否为真,如果为真,执行代码块,直到条件判断为假,结束循环 格式 while 条件: 代码块(循环体) else:- ...
- 解决aspnet上传文件大小限制
<system.web> <httpRuntime executionTimeout="600" maxRequestLength="20480& ...