2

是否可以有一个自定义可用性宏,例如 __OSX_AVAILABLE_STARTING。我需要它以相同的方式执行,我只需要更改它的名称以及参数的版本和数量?

4

1 回答 1

7

是的,当然了。Objective-C 是 C 的严格超集,因此 C 宏非常任您使用,而该工具只是一组 C 宏,最终扩展为 gcc 的__attribute__关键字以声明函数的特殊属性

相关声明都在

要刷新,您可以使用__OSX_AVAILABLE_STARTING宏将函数声明标记为特定版本支持,如下所示:

extern void mymacfunc() __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_NA);

那么我们自己需要什么来实现呢?如果您剥离他们对两种不同操作系统(mac、iphone)的支持,可用性工具可以归结为:

  1. 一个接受版本参数的宏,例如__MY_AVAILABLE_STARTING(<version>)

    #define __MY_AVAILABLE_STARTING(_myversion) __MY_AVAILABILITY_INTERNAL##_myversion
    
  2. 一组版本参数,如 中的那些Availability.h,它们是上述的有效参数:

    #define __MYVER_2_0     20000  
    #define __MYVER_2_1     20100  
    #define __MYVER_2_2     20200  
    #define __MYVER_3_0     30000  
    
  3. 另一组宏,例如AvailabilityInternal.h指定每个版本应该发生的事情(常规支持、已弃用、不可用、弱等)。同样,这是编译器的一个功能,请参阅gcc docs(还有很多其他有趣的选项):

    #define __MY_AVAILABILITY_INTERNAL__MYVER_2_0 __AVAILABILITY_INTERNAL_UNAVAILABLE
    #define __MY_AVAILABILITY_INTERNAL__MYVER_2_1 __AVAILABILITY_INTERNAL_WEAK_IMPORT
    #define __MY_AVAILABILITY_INTERNAL__MYVER_2_1 __AVAILABILITY_INTERNAL_REGULAR
    
  4. 最后,在降压结束的地方,扩展到__attribute__设施的宏。

    对于我上面的那些,你可以继续使用苹果的宏:

    #define __AVAILABILITY_INTERNAL_DEPRECATED         __attribute__((deprecated,visibility("default")))
    #define __AVAILABILITY_INTERNAL_UNAVAILABLE        __attribute__((unavailable,visibility("default")))
    #define __AVAILABILITY_INTERNAL_WEAK_IMPORT        __attribute__((weak_import,visibility("default")))
    #define __AVAILABILITY_INTERNAL_REGULAR            __attribute__((visibility("default")))
    

    或者,当然,你可以定义你自己的疯狂。

C 宏是强大的东西,但经常被忽视。祝你好运!

于 2012-05-09T06:26:22.343 回答