2009-08-10 60 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