【发布时间】:2016-03-29 11:57:59
【问题描述】:
当我在 C++ 的 Objective-C 包装器的头文件中偶然发现这几行相当有趣的代码时,我正在浏览一个使用 C++ 库的 iOS 项目的源代码:
#ifdef __OBJC__
#ifndef __cplusplus
typedef void VisageTracker;
typedef void FaceData;
typedef void DemoFrameGrabber;
typedef void FDP;
typedef void VsImage;
#endif
#endif
@interface TrackerWrapper : NSObject {
CustomGLView *glView;
#ifdef __cplusplus
VisageSDK::VisageTracker* tracker;
VisageSDK::FaceData trackingData;
DemoFrameGrabber *demoFrameGrabber;
DemoObserver *demoObserver;
int glWidth;
int glHeight;
bool inGetTrackingResults;
#endif
}
我立刻想到了一个问题:为什么所有的 C++ 类型,如 VisageTracker, FaceData, DemoFrameGrabber, FDP, VsImage 都被定义为 Objective-C 编译器的 void?
我很好奇 LLVM 是如何在这里进行编译的。头文件似乎会经过两次,一次由 C++ 编译器,一次由 Objective-C 编译器。
问题:为什么我们必须对 Objective-C 编译器隐藏 C++ 类型,但 C++ 编译器可以看到 Objective-C 接口(不仅如此,我们还可以将 C++ 内容“注入”到接口中)?
更新:
我尝试删除这些行
#ifdef __OBJC__
#ifndef __cplusplus
typedef void VisageTracker;
typedef void FaceData;
typedef void DemoFrameGrabber;
typedef void FDP;
typedef void VsImage;
#endif
#endif
之后代码没有编译失败:如果没有这些行,它似乎工作得很好。因此我得出结论,这些行可能存在,因为
- 在旧版本的 Clang 中,类型系统中存在一个错误,可以通过添加这些行来修复。
或/和
- 这是一个代代相传的古老传统,相信以这种方式使 Objective-C 编译器失明可能可以节省一些记忆。
【问题讨论】:
标签: c++ objective-c compilation header clang