我正在修改一个大型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)
就编译而言,它工作正常,但当然链接器无法解析库中的符号,因为命名空间不在实现中.
好吧,我在发布此内容后大约 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)