Objective-C中如何为#if __has_include设置否定判断条件
Objective-C __has_include 否定判断实现方案
错误原因
你之前的写法错误核心是
__has_include()运算符的括号内仅支持传入合法的头文件引用格式(即"自定义头文件.h"或者<系统头文件.h>),不允许直接在括号内插入!取反符号,所以会触发预编译语法报错。
正确实现代码
你需要把取反操作放在__has_include()整个表达式的外侧,写法如下:
#if !__has_include("RNFileViewerManager.h") // 此处编写仅当RNFileViewerManager头文件不存在时才会编译的代码 // 你的自定义RNFileViewerManager实现逻辑写在这里即可 @interface RNFileViewerManager : NSObject // 类属性、方法声明 @end @implementation RNFileViewerManager // 方法实现 @end #endif
原理说明
__has_include()是预处理器提供的运算符,会根据当前工程的头文件搜索路径判断指定头文件是否存在,存在返回1,不存在返回0。- 对整个
__has_include()返回值做取反判断,即可实现「仅当头文件不存在时才编译后续代码」的需求,完全避免符号重复定义的报错。
注意事项
- 如果判断的是系统框架或者Pods里的公开头文件,将括号内的双引号替换为尖括号即可,示例:
!__has_include(<AFNetworking/AFNetworking.h>) - 确保工程的
Header Search Paths配置包含目标头文件所在的路径,否则__has_include可能无法正确识别已存在的头文件。
内容的提问来源于stack exchange,提问作者Alwaysblue
相关产品推荐
相关产品推荐

