将C枚举导入C ++名称空间

时间:2019-02-28 17:11:02

标签: c++ c enums

我正在为C库编写C ++包装器。在C库中,我有一个

typedef enum {bar1,bar2} Foo; /* this is defined in the C library */
我想“带”入C ++名称空间的

。我正在使用

namespace X{
    using ::Foo;
}

实现这一目标。但是,要使枚举成员有资格,我总是必须将它们称为

X::Foo::bar1 

,依此类推。有什么办法可以将C枚举“导入”到C ++命名空间中,而是直接将枚举的值引用为

X::bar1 

等等?或者换句话说,我可以直接将枚举的值导入名称空间吗?

编辑

我不认为这个问题是骗人的,请谅解,因为我意识到有解决办法。

2 个答案:

答案 0 :(得分:4)

这就是使用声明的工作方式。全局Foobar1是两个不同的名称。您的 using声明将名称Foo带入名称空间X,但不会从全局名称空间带入其他任何名称(例如枚举成员的名称)。为此,您需要

namespace X {
  using ::Foo;
  using ::Foo::bar1;
  using ::Foo::bar2;
}

答案 1 :(得分:1)

一个对我有用的解决方案是

namespace X{
    extern "C"{
        #include <C_library.h>
    }
}

在尝试之前,我有种印象,我无法将C链接函数放在名称空间中,但是事实证明我错了。那我就可以做

X::bar1

bar1访问C枚举成员typedef enum {bar1, bar2} Foo;

例如参见extern "C" linkage inside C++ namespace?