混合使用 Objective-C 和 C++ 代码

4
我有一个使用C++库提供的功能的Objective-C/C++应用程序。
其中一个C++类包括以下枚举类型:
class TheClass
{
public:
[...]

enum TheEnum
{
    YES,
    NO,
};

[...]
};

在Objective-C/C++源文件(*.mm)中使用#include包含上述类声明的头文件将导致编译失败,因为预处理器会将"YES"替换为"(BOOL) 1"(同样地,将"NO"替换为"(BOOL) 0")。有没有一种方法可以修复这个问题而不需要重命名枚举值?
2个回答

5

YES和NO是Objective-C中预定义的常量,在objc.h头文件中声明。

您应该能够防止预处理器扩展“YES”和“NO”宏。这可以通过本地#undef指令来完成。

但从技术上讲,如果您将语言关键字用作标识符,可能会遇到麻烦。您不会编写包含名为MAX_PATH的成员的类,对吧?


-1

#import很重要——在Objective-C++源文件中,C++头文件应该使用#include包含。我认为,虽然不确定,但是选择包含指令(#include vs #import)决定了使用哪个预处理器。

您也可以反转枚举常量的声明,因为默认情况下,枚举的成员与从0开始的整数相关联。

根据评论,我错了。看起来你需要重写枚举。抱歉 :(


YES和NO是Objective-C中定义的宏。您不能将这些术语用作标识符。 - xtofl
好的,但在这种情况下,倒转声明顺序仍然有效吗? - Meredith L. Patterson
#import 会导致 MIDL 编译器生成一个头文件,其中包含导入库的 C++ 表示形式,然后由预处理器 #include 引用。 - xtofl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接