2013-10-31 31 views
3

出於好奇,我登陸Apple的CFCalendar.h,發現了一些我從未見過的有趣的語法。谷歌搜索沒有幫助我解釋這裏發生了什麼。我注意到,用於聲明函數的語法被寫入C.CF_EXTERN_C_BEGIN,CF_EXTERN_C_END和CF_EXPORT是做什麼的?

頭文件開始:

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 
+2

這取決於它們被定義爲做什麼。如果你在Xcode中,那麼你可以*跳轉到定義*來查看。 – trojanfoe

+2

我懷疑他們被定義爲通常的'extern「C」{'和'}'。 – 2013-10-31 22:35:30

+0

Xcode沒有找到任何使用*跳轉到定義*。 –

回答

5

在Mac OS和iOS上CF_EXPORT是d定義爲#define CF_EXPORT extern。如果您還不知道extern是否告訴編譯器該符號是外部的(可以從其他代碼文件鏈接的符號)。

CF_EXTERN_C_BEGINCF_EXTERN_C_END和結束宏用於C++(defined(__cplusplus))它們被定義爲什麼都沒有。

CF_IMPLICIT_BRIDGING_ENABLEDCF_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 
+0

非常感謝! – KTas