3

好奇心から、私は Apple のCFCalendar.hにたどり着き、今まで見たことのない興味深い構文を見つけました。グーグル検索は、ここで何が起こっているのかを説明するのに役立ちませんでした. 関数の宣言に使用される構文が C で記述されていることに気付きました。

ヘッダー ファイルは次で始まります。

CF_IMPLICIT_BRIDGING_ENABLED
CF_EXTERN_C_BEGIN

次に、これらの CF_EXPORT アイテムの束があります。

CF_EXPORT
CFLocaleRef CFCalendarCopyLocale(CFCalendarRef calendar);

CF_EXPORT
void CFCalendarSetLocale(CFCalendarRef calendar, CFLocaleRef locale);

CF_EXPORT
CFTimeZoneRef CFCalendarCopyTimeZone(CFCalendarRef calendar);

そして最後はこう締めくくります。

CF_EXTERN_C_END
CF_IMPLICIT_BRIDGING_DISABLED
4

1 に答える 1

6

Mac OS と iOS の両方で、CF_EXPORTとして定義されてい#define CF_EXPORT externます。わからない場合はextern、シンボルが外部 (他のコード ファイルからリンクできるもの) であることをコンパイラに伝えます。

TheCF_EXTERN_C_BEGIN CF_EXTERN_C_ENDおよび end マクロは C++ 用に存在します ( defined(__cplusplus))。それ以外の場合は何も定義されていません。

CF_IMPLICIT_BRIDGING_ENABLEDそしてCF_IMPLICIT_BRIDGING_DISABLED単純に clang プラグマにマップして、corefoundation から ARC への暗黙的なブリッジングをオンまたはオフにします。

CFBase.h の関連部分は次のとおりです。

#ifndef CF_IMPLICIT_BRIDGING_ENABLED
#if __has_feature(arc_cf_code_audited)
#define CF_IMPLICIT_BRIDGING_ENABLED _Pragma("clang arc_cf_code_audited begin")
#else
#define CF_IMPLICIT_BRIDGING_ENABLED
#endif
#endif

#ifndef CF_IMPLICIT_BRIDGING_DISABLED
#if __has_feature(arc_cf_code_audited)
#define CF_IMPLICIT_BRIDGING_DISABLED _Pragma("clang arc_cf_code_audited end")
#else
#define CF_IMPLICIT_BRIDGING_DISABLED
#endif
#endif

#if !defined(CF_EXTERN_C_BEGIN)
#if defined(__cplusplus)
#define CF_EXTERN_C_BEGIN extern "C" {
#define CF_EXTERN_C_END   }
#else
#define CF_EXTERN_C_BEGIN
#define CF_EXTERN_C_END
#endif
#endif

#if !defined(CF_EXPORT)
#if defined(CF_BUILDING_CF) && defined(__cplusplus)
#define CF_EXPORT extern "C" __declspec(dllexport) 
#elif defined(CF_BUILDING_CF) && !defined(__cplusplus)
#define CF_EXPORT extern __declspec(dllexport) 
#elif defined(__cplusplus)
#define CF_EXPORT extern "C" __declspec(dllimport) 
#else
#define CF_EXPORT extern __declspec(dllimport) 
#endif
#endif

#else
#define CF_EXPORT extern
#endif
于 2013-10-31T22:35:11.283 に答える