是否可以向C库中的所有符号添加C++命名空间?

Joh*_*ien 5 c c++ namespaces

我正在修改一个大型C++项目,它在其主要标题之一中定义了一个枚举FooBar.这个枚举随处可见,遗憾的是没有命名空间.

从那个项目开始,我想使用一个C库,遗憾的是,它还在同一个全局命名空间中定义了一个枚举FooBar.

我无法更改库实现,并且很难在C++项目中重命名或命名空间,因为它遍布整个地方.

理想情况下,我会为来自C库的所有符号添加命名空间.我尝试过类似的东西:

namespace c_library_foo {
#include <c_library_foo.h>
}

...
c_library_foo::c_library_function()
...
Run Code Online (Sandbox Code Playgroud)

就编译而言,它工作正常,但当然链接器无法解析库中的符号,因为命名空间不在实现中.

Joh*_*ien 5

好吧,我在发布此内容后大约 2 秒找到了解决方案。添加 extern "C" 会使其在解析符号时删除名称空间,并解决我的问题。就像是:

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

...
c_library_foo::c_library_function()
...
Run Code Online (Sandbox Code Playgroud)


Bil*_*eal 2

没有。在 C++ 中支持名称空间需要名称修改。C 库发出的符号不会被名称损坏(因为在 C 中不会发生这种情况)。您需要重命名 C++ 枚举而不是 C 枚举。