Я просматривал исходный код проекта 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
после чего код не скомпилировался: похоже, он отлично работает и без этих строк. Поэтому я делаю вывод, что эти строки, вероятно, существуют потому, что
- В более старой версии Clang есть ошибка в системе типов, которую можно исправить, добавив эти строки.
или/и
- Это старая традиция, передающаяся из поколения в поколение с верой в то, что ослепление компилятора Objective-C таким образом может сохранить некоторые воспоминания.