将c enum导入c ++类定义

时间:2014-07-10 10:27:02

标签: c++ c enums

我有一个这样的课程:

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)似乎都不起作用。

4 个答案:

答案 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;
}
//==========================================================