簡體   English   中英

如何檢查是否正在使用預處理器在 Objective-C++ 項目中編譯 cpp 文件?

[英]How can I check if a cpp file is being compiled in an Objective-C++ project using the preprocessor?

我有一個 C++ 源文件 (.cpp),它在我的兩個項目之間共享,一個使用 Objective-C++,另一個只使用普通的 C++。 我有那個文件的一部分,我需要為 Objective-C++ 項目和普通 C++ 項目使用不同的代碼,所以我需要檢查項目是否正在使用 Objective-C++ 編譯。 經過一番搜索,我發現可以使用__OBJC__宏來檢查文件是否是由 Objective-C 編譯器編譯的,因此我嘗試了以下代碼:

#ifdef __OBJC__
    //Objective-C++ specific code here
#else
    //Plain C++ specific code here
#endif

問題是__OBJC__宏從未定義,甚至在 Objective-C++ 項目中也沒有定義。 我還注意到__OBJC__宏是在 Objective-C++ 項目的 .mm 文件中定義的,而不是在 .cpp 文件中。

以防萬一,我正在使用 Xcode 為 iOS 編譯 Objective-C++ 項目,而普通的 C++ 項目是一個跨平台的計算機程序,可以使用 Visual Studio、Xcode 或 GCC 進行編譯。

如果我的 .cpp 文件是在 Objective-C++ 項目或普通 C++ 項目中編譯的,我如何使用預處理器進行檢查?

問題是,默認情況下,Xcode 通過擴展名而不是項目來確定文件類型,因此它認為 .cpp 文件是一個普通的 C++ 文件,即使它是 Objective-C++ 項目的一部分,所以它沒有在該文件中定義__OBJC__宏。 解決方案是通過右鍵單擊 Xcode 左側文件列表中的 .cpp 文件來更改編譯模式,單擊“顯示文件檢查器”,然后在 Xcode 右側的“類型”下拉列表中選擇“目標-C++ 源”而不是“默認 - C++ 源”:

在此處輸入圖片說明

這將使 Xcode 認為 .cpp 文件是一個 Objective-C++ 文件,因此它將定義__OBJC__宏。

由於這是針對每個項目的設置,因此它只對 Objective-C++ 項目有效,並且不會更改普通 C++ 項目中的任何內容,因此#ifdef __OBJC__將是一種檢查文件正在編譯到哪個項目中的方法。


感謝Josh Caswell此評論中給我的想法。

暫無
暫無

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

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