我正在修改一个大型C ++项目,该项目在其主要标题之一中定义了一个枚举FooBar。这个枚举随处可见,遗憾的是没有命名空间。
从那个项目开始,我想使用一个C库,不幸的是,它还在同一个全局命名空间中定义了一个枚举FooBar。
我无法更改库实现,并且很难在C ++项目中重命名或命名空间枚举,因为它已在整个地方使用。
理想情况下,我会为来自C库的所有符号添加命名空间。我尝试过类似的东西:
namespace c_library_foo {
#include <c_library_foo.h>
}
...
c_library_foo::c_library_function()
...
并且就编译而言工作正常,但当然链接器无法解析库中的符号,因为命名空间不在实现中。
答案 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。