为什么我们在LLVM中为Objective-C编译器定义C++类型为void(而C++编译器可以看到Objective-

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)?

本文关键字:编译器 C++ Objective- void 类型 LLVM 我们 中为 Objective-C 为什么 定义      更新时间:2023-10-16

我正在浏览一个使用C++库的iOS项目的源代码时,在C++的Objective-C包装器的头文件中偶然发现了这几行非常有趣的代码:

#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是不同的语言。它们只能在Objective-C++中同时使用。