[英]Is Objective-C++ a totally different language from Objective-C?
正如標題所說......他們被認為是不同的語言嗎? 例如,如果您使用C ++和Objective-C ++的組合編寫了一個應用程序,您會認為它是用C ++和Objective-C,C ++和Objective-C ++編寫的,還是全部三個?
顯然C和C ++是不同的語言,即使C ++和C直接兼容,Objective-C ++和Objective-C的情況如何?
Objective-C ++是GNU Compiler Collection的前端,它可以編譯使用C ++和Objective-C語法相結合的源文件。 Objective-C ++為C ++添加了Objective-C添加到C的擴展。由於沒有做任何事情來統一各種語言特性背后的語義,因此適用某些限制:
Objective-C ++簡單地允許混合Objective-C和C ++代碼(帶有警告)。 它本身並不是一種真正的語言,而是一種允許兩種語言混合的機制。
C和C ++不直接兼容。 它們都不是另一個的超集(盡管大多數C是有效的C ++)。 Objective-C是C的嚴格超集,Objective-C ++是C ++的嚴格超集。 這些是您可以做出的唯一陳述(除了簡單地逆轉它)。
乍一看,使用Objective-C ++方言看起來就像一個簡單的方法。 它是在同一個編譯器中將C ++和Objective-C混合在一起的結果 ,並且GCC中存在健壯的實現,現在已經鏗鏘有力。 考慮到Objective-C和C ++的細節有多么不同,GCC黑客已經做得很好。 但是當您開始將.m文件重命名為.mm以引入C ++塊時,您很快意識到它並不那么簡單。
幾十年來,頭文件和C預處理器一直給C,C ++和Objective-C程序員帶來了麻煩。 當你嘗試混合語言時會變得更糟。 假設您想在項目中的Objective-C類中使用STL的映射。 據我所知,Apple的Foundation庫不包含已排序的基於樹的地圖; 例如,我們的一個StyleKit組件就是這樣。 所以我們只需在我們的類中為地圖創建一個實例變量,然后我們就去了:
#include <map>
@interface MyClass : NSObject {
@private
std::map<int, id> lookupTable;
}
// ...
@end
但是,std :: map [2]只對C ++感知編譯器有意義,並且只在#include [3]之后,所以這個頭現在只能從Objective-C ++文件#imported。 現在,任何使用此類的代碼都需要轉換為Objective-C ++本身,從其他頭文件導入會導致級聯效果,從而快速包含整個項目。
在某些情況下,這可能是可以接受的。 但是,將整個項目或大部分項目切換為僅引入在一個位置使用的庫不僅過多; 如果您是唯一一個在具有多個Objective-C程序員的項目上了解C ++的人,您可能會發現這是一個不受歡迎的想法。 它也可能導致問題的方式與使用C ++編譯器編譯純C代碼很少完全沒有問題。 而且,這意味着代碼不能在其他Objective-C項目中自動重用。
因此,除非它如此重要,否則最好不要混淆
要了解有關在目標c中使用目標c ++的策略的更多信息,請點擊此處
如果不了解你想要應用的“不同語言”的定義,就很難自信地回答這個問題。
Objective-C是C的超集:它在C語言之上添加了一些額外的語法。 Objective-C ++以同樣的方式是C ++的超集。
C和C ++實際上是不同的語言。 盡管C ++設計為兼容,但有些C是無效的C ++,反之亦然。
所以,我會說,是的,Objective-C ++是一種與Objective-C不同的語言,因為C ++是一種與C不同的語言。但是,我不會將它們稱為完全不同的語言。
Objective-C可能是你在簡歷中填寫的官方術語。
Objective-C ++實際上並不是一種新語言,它只是指定了一些允許Objective-C代碼與C ++代碼共存的東西。 說你的應用程序是用Objective-C和C ++編寫的,或者只是Objective-C ++可能就是你想要的。 將Objective-C,Objective-C ++,C ++全部放在一邊是多余的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.