2009-08-10 92 views
4

我有一個使用C++庫提供的功能的Objective-C/C++應用程序。混合Objective-C和C++代碼

其中一個C++類的包括這樣一個枚舉:

class TheClass 
{ 
public: 
[...] 

enum TheEnum 
{ 
    YES, 
    NO, 
}; 

[...] 
}; 

包括(使用#import -if該事宜)與一個Objective-C/C上述類聲明頭文件++源文件(* .mm)將導致編譯失敗,因爲預處理器將用「(BOOL)1」替代「YES」(同樣用「(BOOL)0」替代「NO」)。

有沒有辦法解決這個問題,而不重命名的枚舉值?

回答

5

在Objective-C YES and NO are predefined constants,在objc.h頭部聲明。

您應該能夠防止預處理器展開「YES」和「NO」宏觀的,這可以通過完成當地#undeffing他們。

但在技術上,如果您使用的是語言的關鍵字作爲標識符,你可以期望的麻煩。你不會寫一個包含一個成員叫MAX_PATH一類,你會嗎?

-1

#import確實很重要 - Objective-C++源文件中的C++頭文件應該包含在 #include中。我認爲,儘管我不能100%確定,但是包含指令( #include vs #import)的選擇決定了使用哪個預處理器。

你也可以扭轉常量的聲明在枚舉,因爲在默認情況下,枚舉的成員從0

每評論開始整數關聯,我錯了。看起來你將不得不重寫枚舉。對不起:(

+0

YES和NO在Objective-C中定義了宏,不能將這些術語用作標識符。 – xtofl 2009-08-10 12:02:24

+0

好的,但在這種情況下,不會扭轉聲明仍然有效的順序? – 2009-08-10 12:08:27

+0

#import使MIDL編譯器生成一個包含導入庫的C++表示的頭文件,該文件由預處理器隨後包含。 – xtofl 2009-08-10 12:10:25