gpt4 book ai didi

c++ - 为什么我们在 LLVM 中为 Objective-C 编译器将 C++ 类型定义为 void(而 C++ 编译器可以看到 Objective-C 接口(interface))?

转载 作者:太空宇宙 更新时间:2023-11-04 14:30:33 24 4
gpt4 key购买 nike

当我在 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 接口(interface)(不仅如此,我们还可以将 C++ 东西“注入(inject)”到接口(interface)中)?

更新:

我尝试删除这些行

#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++ 中使用。

关于c++ - 为什么我们在 LLVM 中为 Objective-C 编译器将 C++ 类型定义为 void(而 C++ 编译器可以看到 Objective-C 接口(interface))?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36283625/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com