c++ - 在命名空间中包装 extern "C"库时出现问题

标签 c++ namespaces

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

namespace libgretl {
extern "C" {
    #include <gretl/libgretl.h>
}}

但是,这不会编译,我从 gcc 文件中得到“未定义”错误(在 Windows 上使用 mingw32 和 gcc 4.5.2)。 第一个错误来自文件 c++/cstddef 的以下代码块:

_GLIBCXX_BEGIN_NAMESPACE(std)
  using ::ptrdiff_t;
  using ::size_t;
_GLIBCXX_END_NAMESPACE

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

省略 extern "C" 指令没有帮助。使用匿名命名空间可减少错误数量,但仍无法编译。

因此,我的问题是,是否有某种方法可以在不更改 gcc 或库的源文件的情况下包含此类 C 库并将其函数放入命名空间?

谢谢。

米迦勒

最佳答案

你做不到。命名空间不仅仅是源代码装饰,它们还被编译器破坏为对象符号。

库中的原生 C 函数 foo() 将通过目标文件中的符号 _foo 提供,但调用 bar::foo() 将生成对例如 @N3barfoo 的引用。结果,将发生链接器错误。

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

关于c++ - 在命名空间中包装 extern "C"库时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7188069/

相关文章:

c++ - 两个函数声明共享一个定义,这合法吗?

c++ - 编译时未实现的 QColor 错误 (C++)

php - 如何在 Symfony 的 Controller 中使用 PHP 扩展的功能

Python 名称和变量

c++ - 一致使用 using 声明有多重要?

c++ - 线程池 C++

c++ - 将数组拆分为多个数组c++

c# - 找不到命名空间名称 'DispatcherTimer'

Ubuntu autoload_register 上的 PHP 和命名空间问题

c++ - 可变递归模板