首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在命名空间中包装外部"C“库时出现问题

在命名空间中包装外部"C“库时出现问题
EN

Stack Overflow用户
提问于 2011-08-25 17:34:08
回答 3查看 6.9K关注 0票数 9

我使用的是C++的一个C库(libgretl),它的一些函数与我的代码冲突,所以我想将它包装在一个名称空间中,如下所示:

代码语言:javascript
复制
namespace libgretl {
extern "C" {
    #include <gretl/libgretl.h>
}}

然而,这不能编译,我得到了“未定义”的错误从gcc文件(使用mingw32与gcc 4.5.2在视窗)。第一个错误来自文件c++/cstddef的以下代码块:

代码语言:javascript
复制
_GLIBCXX_BEGIN_NAMESPACE(std)
  using ::ptrdiff_t;
  using ::size_t;
_GLIBCXX_END_NAMESPACE

其中,宏将分别展开为namespace std {}。在这些之后还有更多的错误。

省略extern "C"指令无济于事。使用匿名名称空间可以减少错误的数量,但它仍然不能编译。

因此,我的问题是,是否有某种方法可以包含这样的C库,并将其函数放入名称空间中,而无需更改gcc或库的源文件?

谢谢。

米哈尔

EN

回答 3

Stack Overflow用户

发布于 2011-08-25 18:03:12

你不能这么做。命名空间不仅仅是源代码的装饰,它们被编译器破坏成了对象符号。

库中的本机C函数foo()将通过目标文件中的符号_foo可用,但是调用bar::foo()将生成对例如@N3barfoo的引用。因此,将发生链接器错误。

您可以在单独的源文件中创建“代理”函数,包括仅在此源文件中的原始库标题,并将所有代理函数放入命名空间。

票数 7
EN

Stack Overflow用户

发布于 2011-08-25 17:51:56

您不能简单地将一个名称空间包装在一个外部声明中,并让它出现在该名称空间中……项(function,global)必须从一开始就在该命名空间中构建。因为C不支持名称空间解析,所以不可能出现这种情况。

你需要修改你自己的代码来适应这个库,除非你愿意赞同库本身。

要引用与您自己的命名空间项冲突的非命名空间项,请参阅::item()

票数 3
EN

Stack Overflow用户

发布于 2011-08-25 17:41:01

我猜C库被编译为C,这意味着在编译后的代码中不包含也不支持名称空间。因此,编译后的C库不能在名称空间中。通过封装include来更改标头不会改变这一点。

您仍然可以将自己的代码封装在命名空间中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7188069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档