【问题标题】:Importing C enum into C++ namespace将 C 枚举导入 C++ 命名空间
【发布时间】:2019-07-22 16:13:54
【问题描述】:

我正在为 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 

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

编辑

我不认为这个问题是骗人的,请看我的回答,因为我意识到有一个解决方案。

【问题讨论】:

标签: c++ c enums


【解决方案1】:

对我有用的解决方案是这样做

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

在尝试之前,我的印象是我不能将 C 链接函数放在命名空间中,但事实证明我错了。然后我可以简单地做

X::bar1

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我意识到我也可以做namespace X{ extern "C" {include &lt;C_library&gt;} },这将为我做这件事。出于某种原因,我虽然不能在命名空间内使用 C 链接...
    猜你喜欢
    • 1970-01-01
    • 2014-01-14
    • 2023-03-30
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 2014-04-15
    • 2011-09-12
    • 1970-01-01
    相关资源
    最近更新 更多