iOS_预编译(宏)#if #ifdef #ifndef #elif #else #endif
iOS_预编译
1、预处理
ANSI C标准(是美国国家标准协会(ANSI)对C语言)规定可以在C源程序中加入一些“预处理命令”,以改进程序设计环境,提高编译效率。这些预处理命令时有ANSI C统一规定的,但它不是C语言本身的组成部分,不能直接对它们进行编译,需要在编译之前对这些特殊指令进行处理,这个过程即“预处理”。经过预处理后程序可由编译程序对预处理后的源程序进行通常的编译,得到可供执行的目标代码。
OC中的预编译指令分为三种:宏定义、条件编译、文件包含。
1、宏定义
1.1、定义 和 取消定义
#define 标识符 字符串
:定义个宏,标识符
就是这个宏的名称,一般习惯用大写字母,以便与变量名区别。只做字符替换,不分配内存空间,不做正确性检查和运算逻辑处理。#undef 标识符
:取消一个宏,之后这个宏的定义就无效了。但可以重新使用#define
进行定义。
例如:
// 不含参数
#define SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width
// 含参数
#define MAX3(a,b,c) (a > b ? (a > c ? a : c) : (b > c ? b : c))
1.2、可变参数
参数个数可变:使用参数使用...
,在需要传递参数的地方使用__VA_ARGS__
。
// 参数个数可变
#define safeCallback(callback, ...) if (callback) { callback(__VA_ARGS__); }
1.3、宏定义中换行
需要在每行的结尾加反斜杠\
:
#define safeCallback(callback, ...)\if (callback) {\callback(__VA_ARGS__);\}\
2、条件编译
根据预处理指令
判断条件编译对应的代码,未满足条件的代码不会被编译(相当于没这段代码)。
条件编译指令:
#if
当条件为真,则编译这段代码#ifdef
(if define
) 当宏被定义,则编译这段代码#ifndef
(if no define
) 当宏未被定义,则编译这段代码#elif
(else-if
) 若前面条件不满足,则执行#elif
条件判断#else
若前面条件不满足,则编译这段代码#endif
条件编译指令结束标志
例如:
#ifdef VERSIOIN_2
// 版本2代码
#elif VERSIOIN_1
// 版本1代码
#else
// 旧代码
#endif
还有一种在pch文件中可以自带一个条件编译:防止该文件的重复引用
#ifndef Header_h
#define Header_h#endif
iOS系统常用的宏:
// 判断是否为真机
#if TARGET_OS_IPHONE
#endif// 判断是否是模拟器
#if TARGET_OS_SIMULATOR // 同上。"TARGET_IPHONE_SIMULATOR"已经废弃
#endif// 判断手机系统版本
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_9_0
#endif// 规定只能在ios系统下运行
#ifdef __IPHONE_OS_VERSION_MIN_REQUIRED // 规定运行支持的最小版本#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_7_0#endif
#endif
可以参照Availability.h
文件
(路径:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/Availability.h
)
3、文件包含
- C语言一般使用
#include
,需要注意不要重复引用 - OC语言一般使用
#import
。大部分功能和#inculde
一样,不过处理了重复引用的问题。 - OC语言还有个引用声明
@class
,用于声明一个字符串,告诉编译器这是一个类,而这个类的实现暂时不用知道。但在实际需要用到这个类的接口时,还是需要使用#import
引入。
参考:
iOS 预编译指令#if #ifdef #elif #else #endif #import #define的简单使用
iOS_预编译(宏)#if #ifdef #ifndef #elif #else #endif相关推荐
- C语言中宏定义宏编译的使用#if,#ifdef,#ifndef,#elif,#else,#endif,defined使用详解,可以实现和if else一样的效果
#define 定义一个预处理宏 #undef 取消宏的定义 #if 编译预处理中的条件命令,相当于C语法中的if语句 ...
- C中的预编译宏定义-转
C中的预编译宏定义 2009-02-10 作者: infobillows 来源:网络 在将一个C源程序转换为可执行程序的过程中, 编译预处理是最初的步骤. 这一步骤是由预处理器(preprocesso ...
- C++头文件中预编译宏的目的
C++头文件中预编译宏的目的 eg: #ifndef _FACTORY_H_ #define _FACTORY_H_ ...... #endif //~_FACTORY_H_ 防止头文件被重复包含,导 ...
- Swift - 设置预编译宏
选中 target ---> Build Settings ---> 搜索 Swift Compiler - Custom Flags 展开 Active Compilation Cond ...
- [Swift5] Swift 设置自定义预编译宏
在开发中经常用 target 区分正式.测试环境,用到自定义的预编译宏来判断,OC中可以在 target 的 Preprocessor Macros 里设置,Swift 则不同. Swift设置预编译 ...
- c语言如何增加编译宏,C中的预编译宏定义
在将一个C源程序转换为可执行程序的过程中, 编译预处理是最初的步骤. 这一步骤是由预处理器(preprocessor)来完成的. 在源流程序被编译器处理之前, 预处理器首先对源程序中的"宏( ...
- C语言学习笔记--预编译/宏定义/数组/参数传递/函数指针
目录 预编译 值传递.指针传递.引用传递 数组 typedef 函数指针 预编译 预编译又叫预处理.预编译不是编译,而是编译前的处理.这个操作是在正式编译之前由系统自动完成的.#define 和 #i ...
- c语言数组宏定义标识符,C语言学习笔记--预编译/宏定义/数组/参数传递/函数指针...
目录 预编译 值传递.指针传递.引用传递 数组 typedef 函数指针 预编译 预编译又叫预处理.预编译不是编译,而是编译前的处理.这个操作是在正式编译之前由系统自动完成的.#define 和 #i ...
- C/C++跨平台的的预编译宏
我们在编译一些跨平台的程序的时候难免会遇到_WIN32 __linux__什么之类的SDK或者编译器环境预定义的宏.有很多,之前还分不清_WIN32 和WIN32的区别.不过这里还好有个列表,做个备 ...
最新文章
- FPGA设计心得(9)基于DDS IP核的任意波形发生器设计
- js判断鼠标旋转度数以及顺逆方向详解
- 【练习】c++删除链表倒数第K个结点和 插入排序算法将单链表递增排序
- 【图示,简单明了】HttpServlet中getAttribute和getParameter的区别——【javaweb系列学习笔记】
- SpringApplication.run做了哪些事情
- Maven常见问题和陷阱
- 为什么我要重新开始数据科学
- arcgis创建剖面线execl文件
- magento模板中XML与phtml关系
- python状态码及其含义_Shell退出状态码及其应用详解
- 数据科学包4-pandas核心数据结构
- 大数据技术原理与应用 第三版 林子雨 期末复习(一)大数据概述 第一章 P2
- 计算机主机报警 声,电脑开机报警声音大全
- 计算机网络常用五种编码方式,五种常见的基带数字编码方式
- 什么是微服务(通俗易懂)
- 正则表达式匹配书名号内容
- Thunderbird – 开源免费跨平台邮箱客户端
- vant移动端上传附件
- VRTK 初识vrtk,如何在自己的项目中使用vrtk
- 《每日一题》NO.13:名词解释 设计流程篇
热门文章
- python最新官网图片_Python轻松爬取Rosimm写真网站全部图片
- iOS与安卓的区别 浅谈ios为什么比安卓流畅
- 币须知道 |币安要做联盟计划,首期1000个名额,平台币运作模式 ,ADA创始人:华尔街准备“下一波监管”之后投资“数万亿美元”...
- 控制用计算机应具有特点,国开(中央电大)专科《可编程控制器应用》网上形考、机考试题及答案...
- 科技“战”疫,AI的春天来了吗?
- HDU - 人见人爱A+B
- (Linux)私人云盘seafile搭建详解
- 头像叠加android_使用RecyclerView实现点赞头像叠加效果
- java面试官:程序员,请你告诉我是谁把公司面试题泄露给你的?
- Linux服务器 | 01.服务器购买与基本配置