在命名空间中包装extern"C"库的问题

Mic*_*aut 8 c++ namespaces

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

namespace libgretl {
extern "C" {
    #include <gretl/libgretl.h>
}}
Run Code Online (Sandbox Code Playgroud)

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

_GLIBCXX_BEGIN_NAMESPACE(std)
  using ::ptrdiff_t;
  using ::size_t;
_GLIBCXX_END_NAMESPACE
Run Code Online (Sandbox Code Playgroud)

宏分别扩展到namespace std {}.之后会有更多错误.

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

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

谢谢.

米哈尔

bla*_*aze 7

你不能这样做.命名空间不仅仅是源代码装饰,它们通过编译器被修改为对象符号.

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

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


Bob*_*Bob 1

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

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