簡體   English   中英

為什么我們將 C++ 類型定義為 LLVM 中的 Objective-C 編譯器的 void(而 C++ 編譯器可以看到 Objective-C 接口)?

[英]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-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
}

我立刻VisageTracker, FaceData, DemoFrameGrabber, FDP, VsImage一個問題:為什么所有的 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++

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM