Почему мы определяем типы C++ как void для компилятора Objective-C в LLVM (хотя для компилятора C++ нормально видеть интерфейсы Objective-C)?

Я просматривал исходный код проекта iOS, использующего библиотеку 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

@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, определяются как void для компилятора Objective-C?

Мне очень любопытно, как LLVM делает здесь компиляцию. Похоже, что заголовочный файл будет обработан дважды: один раз компилятором C++ и один раз компилятором Objective-C.

Вопрос: почему мы должны скрывать типы C++ от компилятора Objective-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 таким образом может сохранить некоторые воспоминания.

person Archy Will He 何魏奇    schedule 29.03.2016    source источник


Ответы (1)


Потому что C++ и Objective-C это разные языки. Оба они могут быть использованы только в Objective-C++.

person Cy-4AH    schedule 29.03.2016
comment
Да, я знаю об этом. Но это не отвечает на вопрос, почему мы прячем типы C++. - person Archy Will He 何魏奇; 29.03.2016
comment
@Arch, чтобы скрыть типы C++ от Objective-C. - person Cy-4AH; 29.03.2016