是否能够为C库中的所有符号添加C++命名空间?

6
我正在修改一个大型的C++项目,其中在其主要头文件中定义了枚举FooBar。该枚举被随处引用,不幸的是没有命名空间。
我想从该项目中使用一个C库,但不幸的是,它也在同一全局命名空间中定义了一个枚举FooBar。
我无法更改库的实现,而在C++项目中重命名或命名空间化枚举很困难,因为它在项目中得到广泛使用。
因此,最好的方法是向来自C库的所有符号添加命名空间。我尝试过类似以下方式的操作:
namespace c_library_foo {
#include <c_library_foo.h>
}

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

就编译而言,这是可行的,但链接器无法解析库中的符号,因为命名空间不在实现中。

2个回答

5

发布这篇文章后,我大约在2秒钟内找到了解决方案。添加 extern "C" 可以使其在解析符号时删除命名空间,并解决我的问题。类似于:

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

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

除非现在您的程序无法链接(或者说表现出未定义的行为)。 - Billy ONeal
1
@Billy:这不是未定义的行为。这正是C++头文件对C头文件所做的操作。如果你包含 <cstring>,那么你就可以很好地调用 std::memcmp()。 - Zan Lynx
@Zan:因为C++定义了函数必须存在。仅仅因为它在你的平台上能够工作并不意味着它没有违反一个定义规则。 - Billy ONeal
1
@Zan:刚刚意识到这里有一些误解。按照描述将C函数放入命名空间中是明确定义的。不明确定义的是在全局命名空间中也有与C函数同名的C++函数/项。 - Billy ONeal

2

不行。支持C++命名空间需要进行名称重整。C库发出的符号没有名称重整(因为C中没有这种情况)。你需要重新命名C++枚举而不是C枚举。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接