我正在使用 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/