たとえば、__OSX_AVAILABLE_STARTINGのようなカスタム可用性マクロを持つことは可能ですか。同じように実行する必要があります。名前とバージョン、およびパラメーターの数を変更するだけで済みますか?
1 に答える
はい、確かに。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)のサポートを削除すると、可用性機能は次のようになります。
次のようなバージョン引数を取るマクロ
__MY_AVAILABLE_STARTING(<version>)
:#define __MY_AVAILABLE_STARTING(_myversion) __MY_AVAILABILITY_INTERNAL##_myversion
Availability.h
上記の有効な引数である、のようなバージョン引数のセット:#define __MYVER_2_0 20000 #define __MYVER_2_1 20100 #define __MYVER_2_2 20200 #define __MYVER_3_0 30000
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
そして最後に、支出が終わるところで、
__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マクロは強力なものであり、見過ごされがちです。幸運を!