我有一个这样的课程:
class TType {
public:
...
enum binary_type {
bt_a = 0,
bt_xyz,
....
bt_ak = 10,
....
};
}
我在几个地方使用它,也就是enum:
if(var12 == TType::bt_a ) { ....
现在我导入了一个C库,它在其中一个头文件中具有完全相同的枚举(相同的键,相同的值,相同的大小):
typedef enum data_types_e {
bt_a = 0,
bt_xyz,
....
} data_types;
如何在c ++类定义中定义枚举以使用c头文件的声明? 我想以与之前相同的方式继续使用枚举(TType :: bt_a),并避免复制整个枚举。此外,我不会修改库(否则预处理器 - 宏会做的伎俩),我希望库中的更改也可以在我的类中的枚举。
在这种情况下,c ++类定义中的typedef和类型别名(c ++ 11)似乎都不起作用。
答案 0 :(得分:2)
"如何在c ++类定义中定义枚举以使用c头文件的声明?"
您可以简单地重用c-style枚举中的值:
#include "TheOtherEnum.h"
...
enum binary_type {
bt_a = ::bt_a,
bt_xyz = ::bt_xyz,
....
bt_ak = ::bt_ak,
....
};
"在这种情况下,c ++类定义中的typedef和类型别名(c ++ 11)似乎都不起作用。"
是的,这些可以提供正确的枚举类型,但您仍然需要限定全局命名空间中的值,而不是嵌套到您的类。
答案 1 :(得分:0)
您可以使C ++枚举依赖于C enum:
typedef enum data_types_e {
bt_a = 0,
bt_xyz,
....
} data_types;
// ...
class TType {
public:
...
enum binary_type {
bt_a = bt_a,
bt_xyz = bt_xyz,
....
};
}
答案 2 :(得分:0)
这是我的答案,这是一个古老的话题,但最近比从未好过
class TType {
public :
public:
...
#undef __cplusplus
#include "yourheaderc.h"
#define __cplusplus
}
可能会使用typedef binary_type data_types
来保留您的提名
但是如果您的标题不包含C ++中禁止的语法C,则可以使用此解决方案。我目前正在搜索新的解决方案,因为我的标题中有原型包含以下内容:
void afunction( unsigned long id,
enum T_TYPE type,
enum T_CHAR characteristic,
unsigned short number,
unsigned short value);
因为T_TYPE和T_CHAR不是typedef-ed,但是这种语法在C ++中是无意义的,因为它是声明语法。因此,如果您处于类似情况,我的解决方案并不合适。
答案 3 :(得分:0)
如果可能,请尝试重命名您的班级TType
,例如class TType_1
。
//=============CLibraryFileContainingEnum.h=================
typedef enum data_types_e
{
bt_a = 9999,
bt_xyz
} data_types;
//==========================================================
//==========================================================
class TType_1
{
public:
enum binary_type
{
bt_a = 8878,
bt_xyz
};
};
namespace TType
{
#include "CLibraryFileContainingEnum.h"
}
int main()
{
int a = TType::bt_a; //this prints 9999
cout << a << endl;
return 0;
}
//==========================================================