如何以向后兼容的方式使用Objective-C __nonnull?

时间:2015-06-28 22:32:22

标签: xcode compatibility nullable non-nullable

Xcode最近添加了__nonnull__nullable等属性。但是,旧版本的clang和其他编译器不支持它们。

如何以兼容的方式使用这些属性?

我希望这样的事情会起作用:

#ifndef NS_ASSUME_NONNULL_BEGIN
#define __nonnull 
#endif

但似乎NS_ASSUME_NONNULL_BEGIN不是真正的宏,而且它在Xcode7中“未定义”。

这样做有意义:

#if !defined(__is_identifier) || __is_identifier(__nonnull)
#define __nonnull
#define __nullable
#endif

但是Xcode 6会因为“令牌不是预处理器子表达式中的有效二元运算符”而产生错误。

1 个答案:

答案 0 :(得分:4)

正如问题中所解释的那样,所有好方法似乎都不起作用。最直率的是:

#if !defined(__clang_major__) || __clang_major__ < 7
#define __nonnull
#define __nullable
#endif