【问题标题】:Why do we define C++ types as void for the Objective-C compiler in LLVM (while it is okay for the C++ compiler to see objective-C interfaces)?为什么我们在 LLVM 中将 Objective-C 编译器的 C++ 类型定义为 void(而 C++ 编译器可以看到 Objective-C 接口)?
【发布时间】: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

之后代码没有编译失败:如果没有这些行,它似乎工作得很好。因此我得出结论,这些行可能存在,因为

  1. 在旧版本的 Clang 中,类型系统中存在一个错误,可以通过添加这些行来修复。

或/和

  1. 这是一个代代相传的古老传统,相信以这种方式使 Objective-C 编译器失明可能可以节省一些记忆。

【问题讨论】:

    标签: c++ objective-c compilation header clang


    【解决方案1】:

    因为C++Objective-C 是不同的语言。 它们只能在Objective-C++ 中使用。

    【讨论】:

    • 是的,我知道这一点。但这并不能回答我们为什么要隐藏 C++ 类型的问题。
    • @Arch 从Objective-C 中隐藏C++ 类型。
    猜你喜欢
    • 1970-01-01
    • 2013-07-15
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    • 2016-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多