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

时间:2010-12-03 23:11:22

标签: c++ c namespaces

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

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

我无法更改库实现,并且很难在C ++项目中重命名或命名空间枚举,因为它已在整个地方使用。

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

namespace c_library_foo {
#include <c_library_foo.h>
}

...
c_library_foo::c_library_function()
...

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

2 个答案:

答案 0 :(得分:4)

我发布此帖后发现解决方案约为2s。添加extern“C”会使它在解析符号时删除命名空间,并修复我的问题。类似的东西:

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

...
c_library_foo::c_library_function()
...

答案 1 :(得分:2)

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