2

たとえば、__OSX_AVAILABLE_STARTINGのようなカスタム可用性マクロを持つことは可能ですか。同じように実行する必要があります。名前とバージョン、およびパラメーターの数を変更するだけで済みますか?

4

1 に答える 1

7

はい、確かに。Objective-CはCの厳密なスーパーセットであるため、Cマクロは自由に使用できます。この機能は、関数の特別な属性を宣言するために最終的に gccの__attribute__キーワードに展開されるCマクロのセットにすぎません。

関連する宣言はすべて

更新するには、次のように、__OSX_AVAILABLE_STARTINGマクロを使用して、特定のバージョンでサポートされているものとして関数宣言にタグを付けます。

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

では、これを自分で実装するには何が必要なのでしょうか。2つの異なるOS(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各バージョンで何が起こるかを指定するthosのような別のマクロのセット(通常のサポート、非推奨、使用不可、弱いなど)。繰り返しますが、これはコンパイラの機能です。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__施設に拡張するマクロ。

    私が上に持っているものについては、あなたはただAppleのマクロを使い続けることができます:

    #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 に答える