iOS代码运行的磨刀石-预编译指令 原

iOS中代码运行的磨刀石--预编译指令

所谓预编译,就是程序代码在编译之前,开发工具为我们预先做的一些工作。不要小瞧这些指令,没有它们,我们的代码可能寸步难行。

一、文件包含相关预处理命令

#include <header>

#include "header"

C语言中使用的包含文件的指令""和<>的区别为,""是从当前目录开始寻找文件,<>是从系统库中寻找文件。这两个指令不能使头文件循环引入,也不能重复包含同一个头文件。

#import "header"

#import <header>

这两个指令和上面两个作用一样,只是更加智能,智能处理重复包含头文件的问题。

#include_next "header"

#include_next <header>

这两个指令是C中的指令,OC也支持,只是很少使用,它的作用是在找到名字匹配的头文件后跳过,寻找下一个相同名字的导入。

二、宏定义

宏定义是开发中会经常用到的一个指令了,我们还会将许多简单的函数定义为宏,省去系统压栈的时间,提高代码效率。因为这篇博客的主题是预处理命令,所以宏的用法和高级用法就不再多写了,下次再讨论。

#define 参数1 参数2

定义一个简单的替换宏,不带参数,在预编译阶段,会把所有参数1的地方直接替换为参数2。 

#define ADD(x) (x+x)

定义一个带参数的宏,类似带参函数的功能,但也是编译前做简单替换。

三、条件编译

条件编译用于判断一个表达式是否成立,成立则进入条件编译。

方式一:

#if 表达式

#else 

#endif 

方式二:

#if 表达式

#elif 表达式

#endif

方式三:

#ifndef 

如果没有定义一个宏进行编译

#ifdef

如果定义一个宏进行编译

四、错误,警告的预处理

#error 错误

当程序检查到这里时会停止编译,这个命令的作用是在错误的地方禁止编译。

#warning 警告

这个命令并不会影响程序的编译和运行,但是会认为的在这里显示一条警告信息,提醒我们自己。

五、更改文件名和行号

在OC中,有一个系统的定义的宏:

__LINE__

这个宏表示当前行的行号,可以打印。

#line number

改变当前行的行号,会影响下面所有的行

#line number "filename"

改变当前行号和编译后的文件名

六、编译器控制指令

#pragma 参数

这个预编译指令是最复杂的,用于控制编译器的行为,一般我们开发应用APP是很少用到的,常用的有两种方式:

#pragma mark - 信息

为代码加上标注

#pragma message("信息")

编译时提示信息

专注技术,热爱生活,交流技术,也做朋友。 ——珲少 QQ群:203317592

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏西枫里博客

thinkPHP5模版页面volist循环offset不能使用变量

有这样一个应用场景:当volist循环需要排除前面几个数据的时候,我们通常使用offset来操作。而假设前面要排除的数据是根据当前页面占位符来确定的,而需要排除...

892
来自专栏我的博客

awk第二课

使用方法:awk ‘{pattern + action}’ {filenames} 尽管操作可能会很复杂,但语法总是这样,其中 pattern 表示 AWK 在...

35510
来自专栏WD学习记录

8-21Android 学习ing

(2)Tomcat服务器默认采用的是ISO8859-1编码得到的参数值,这种编码不支持中文,也会导致乱码

1043
来自专栏Petrichor的专栏

python: py2下 中文 的 文件读写 及 打印

  读写中文文件时,不需要考虑编码的情况。此时虽然可以正常从文件中读取中文,也可以正常地将中文写入文件中,但是无法正常打印中文字段到屏幕上:

3122
来自专栏开源优测

RobotFramework怎么写好用例

github地址:https://github.com/robotframework/HowToWriteGoodTestCases/blob/master/H...

2712
来自专栏Python攻城狮

Redis的安装及基本使用1.Redis2.Redis安装3.redis常见配置4.redis数据操作5.redis发布订阅6.主从双备

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。它支持多种类型的数据结构,如 字符串(strings), ...

711
来自专栏性能与架构

console.log() 之外的调试技巧

console.log( ) 是JS开发时常用的小工具,输出一些信息来辅助调试,console 还有很多有用的方法,下面介绍几个方便调试的用法 跟踪堆栈 例如想...

3739
来自专栏编程

文件与异常(三)

异常 Python使用被称为异常的特殊对象来管理程序执行期间发生的错误。每当发生让Python不知 所措的错误时,它都会创建一个异常对象。如果你编写了处理该异常...

1796
来自专栏前端知识分享

第217天:深入理解Angular双向数据绑定的原理

双向绑定是新的前端框架中频繁出现的一个新词汇,也是mvvm的核心原理。angularjs五条核心信念中的数据驱动,便是由双向绑定进行完成。

1612
来自专栏张善友的专栏

深入浅出事件流处理NEsper(三)

首先介绍一下NESPER的大体结构,NEsper从内容上分为两块,NEsper的核心NEsper.dll和NEsper.IO.dll。 (1)NEsper的核...

22610

扫码关注云+社区

领取腾讯云代金券