出于好奇,我登陆了Apple的CFCalendar.h,发现了一些我从未见过的有趣语法.谷歌搜索没有帮助我解释这里发生了什么.我注意到用于声明函数的语法是用C语言编写的.
头文件以:
CF_IMPLICIT_BRIDGING_ENABLED
CF_EXTERN_C_BEGIN
Run Code Online (Sandbox Code Playgroud)
然后它有一堆这些CF_EXPORT项:
CF_EXPORT
CFLocaleRef CFCalendarCopyLocale(CFCalendarRef calendar);
CF_EXPORT
void CFCalendarSetLocale(CFCalendarRef calendar, CFLocaleRef locale);
CF_EXPORT
CFTimeZoneRef CFCalendarCopyTimeZone(CFCalendarRef calendar);
Run Code Online (Sandbox Code Playgroud)
然后它最终以此结束:
CF_EXTERN_C_END
CF_IMPLICIT_BRIDGING_DISABLED
Run Code Online (Sandbox Code Playgroud)
在Mac OS和iOS CF_EXPORT上定义为#define CF_EXPORT extern.如果你不知道已经extern告诉编译器符号是外部的(可以从其他代码文件链接的那个).
的CF_EXTERN_C_BEGIN CF_EXTERN_C_END和结束的宏是有用于C++( defined(__cplusplus))它们被定义为任何以其他方式.
CF_IMPLICIT_BRIDGING_ENABLED并CF_IMPLICIT_BRIDGING_DISABLED简单地映射到clang pragma以打开和关闭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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
644 次 |
| 最近记录: |