ios - CF_EXTERN_C_BEGIN、CF_EXTERN_C_END 和 CF_EXPORT 有什么作用?

标签 ios objective-c

出于好奇,我访问了 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

最佳答案

在 Mac OS 和 iOS 上 CF_EXPORT 被定义为 #define CF_EXPORT extern。如果您还不知道,extern 会告诉编译器该符号是外部符号(可以从其他代码文件链接的符号)。

CF_EXTERN_C_BEGIN CF_EXTERN_C_END 和结束宏是为 C++ (defined(__cplusplus)) 定义的,否则它们没有定义。

CF_IMPLICIT_BRIDGING_ENABLEDCF_IMPLICIT_BRIDGING_DISABLED 简单地映射到 clang pragmas 以打开和关闭 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

关于ios - CF_EXTERN_C_BEGIN、CF_EXTERN_C_END 和 CF_EXPORT 有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19717633/

相关文章:

ios - ios中uiscrollview的底部刷新控件

ios URLSessionDataTask 使用数据恢复

iOS,判断网络访问类型

ios - 人脸检测和图像放置在它上面

objective-c - objective-c 中的 "to the power of"符号是什么

ios - 如何在 Swift 中对对象进行 Nil

ios - 无法在装有 iOS 11.0.1 的设备上使用 Charles 4.1.4 中的 SSL 代理

ios - 解析 - 使用关系还是指针?

ios - 我如何使NSString显示数组计数

objective-c - Objective-C/Cocoa 中的 (id) 与 (NSSomeObject *) ?