在C ++中使用C标志枚举

我有一个C API,它定义了一个枚举,如下所示:

typedef enum { C_ENUM_VALUE_NONE = 0, C_ENUM_VALUE_APPLE = (1 << 0), C_ENUM_VALUE_BANANA = (1 << 1), C_ENUM_VALUE_COCONUT = (1 << 2), // etc. C_ENUM_VALUE_ANY = ~0 } CEnumType; 

有一种使用枚举的方法,定义如下:

 void do_something(CEnumType types); 

在C中,您可以调用以下内容:

 do_something(C_ENUM_VALUE_APPLE | C_ENUM_VALUE_BANANA); 

但是,如果您尝试在C ++(Linux,g ++编译器)中以这种方式调用它,则会出现错误, 从“int”到“CEnumType”的无效转换

从我的C ++应用程序中使用此C API的正确方法是什么?

您需要在C ++中将int为枚举,但您可以在自定义OR运算符中隐藏转换:

 CEnumType operator|(CEnumType lhs, CEnumType rhs) { return (CEnumType) ((int)lhs| (int)rhs); } 

使用此操作符,您可以编写原始文件

 do_something(C_ENUM_VALUE_APPLE | C_ENUM_VALUE_BANANA); 

它会编译运行没有问题。

对于枚举,C ++有比C更严格的规则。 调用时,您需要将值强制转换为枚举类型:

 do_something((CEnumType)(C_ENUM_VALUE_APPLE | C_ENUM_VALUE_BANANA)); 

或者,您可以编写一个包装器函数,如果您希望每次调用它时都避免编写演员,则可以使用int为您执行演员:

 void do_something_wrapper(int types) { do_something((CEnumType)types); } ... do_something_wrapper(C_ENUM_VALUE_APPLE | C_ENUM_VALUE_BANANA); 

虽然我不知道当你用香蕉过苹果时我是否想看看你得到了什么……

在按位运算的情况下,表达式求值为基本类型,即intlong等。但是,您的函数采用非基本类型( CEnumType )。 我知道绕过这个的唯一方法是转换表达式。 例如:

 do_something((CEnumType) (C_ENUM_VALUE_APPLE | C_ENUM_VALUE_BANANA)); 

CEnumType A;

A =(CEnumType)(A | C_ENUM_VALUE_APPLE);

你也可以这样使用它。

通过输入两个枚举值,您将创建一个无效值(0x3不在枚举CEnumType中)。 枚举不是位域。 如果需要位域,请定义一个。

如果你想强制它,你可以强制转换值,但这可能会让一些只能获得枚举值的代码感到惊讶。

 do_something((CEnumType)(C_ENUM_VALUE_APPLE | C_ENUM_VALUE_BANANA));