出于好奇,我登陆了苹果公司的 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

最佳答案

在Mac OS和iOS上,CF_EXPORT都定义为#define CF_EXPORT extern。如果您还不知道extern告诉编译器该符号是外部的(可以从其他代码文件链接该符号)。
CF_EXTERN_C_BEGIN CF_EXTERN_C_END和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

10-01 09:03