我正在使用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或库的源文件?
谢谢.
米哈尔
你不能这样做.命名空间不仅仅是源代码装饰,它们通过编译器被修改为对象符号.
库中的本机C函数foo()将在目标文件中由符号_foo提供,但调用bar :: foo()将生成对例如@N3barfoo的引用.结果,将发生链接器错误.
您可以在单独的源文件中创建"代理"函数,包括仅在此源中的原始库头,并将所有代理函数放入命名空间.
我猜想 C 库被编译为 C,这意味着编译的代码中不包含也不支持命名空间。因此,您编译的 C 库不能位于命名空间中。通过封装包含来改变标头不会改变这一点。
您仍然可以将自己的代码封装在命名空间中。
| 归档时间: |
|
| 查看次数: |
6138 次 |
| 最近记录: |