C++ “外部包装问题”;";命名空间中的库

C++ “外部包装问题”;";命名空间中的库,c++,namespaces,C++,Namespaces,我使用C++的C库(LIGBReTL),它的一些函数与我的代码冲突,所以我想把它包在一个命名空间中,像这样: namespace libgretl { extern "C" { #include <gretl/libgretl.h> }} 其中宏分别扩展到命名空间std{和}。在这些之后还有更多的错误 省略extern“C”指令没有帮助。使用匿名名称空间可以减少错误数量,但仍然无法编译 因此,我的问题是,是否有某种方法可以在不更改gcc或库的源文件的情况下包含这样一个C库并

我使用C++的C库(LIGBReTL),它的一些函数与我的代码冲突,所以我想把它包在一个命名空间中,像这样:

namespace libgretl {
extern "C" {
    #include <gretl/libgretl.h>
}}
其中宏分别扩展到
命名空间std{
}
。在这些之后还有更多的错误

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

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

谢谢


Michal

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


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

您不需要简单地将名称空间包装在外部声明周围,并使其显示在该名称空间中。。。项(函数,全局)必须从一开始就在该命名空间中构建。因为C不支持名称空间解析,所以不可能是这种情况

您需要更改自己的代码以适应此库,除非您愿意吟唱库本身


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

您不能这样做。名称空间不仅仅是源代码装饰,编译器会将它们损坏为对象符号

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


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

简短的回答是否,我认为问题可能是
gretl/libgret1.h
包括
stddef.h
,因此,您在名称空间中间接地包含了一个标准头,这是一个不可否认的奇怪现象-我为另一个C库这样做,它在那里工作。我天真地认为C代码“看不到”命名空间,即它只会影响封装的C++代码……为了在名字空间中封装我自己的代码——我这样做,通过一些库的定义与我的命名空间名称冲突:-(@ Michal Kaut:那么你需要指定的函数是:;将引用全局命名空间中的
foo()
,而
foo();
将根据常规规则拾取第一个匹配项。@Dribea不确定:库定义了一个名为PCA的常量,而我的代码有一个名为PCA的命名空间;因此,在到达第二个定义时,即在我使用这两个对象中的任何一个之前,编译将失败。我想我理解你的意思,但它没有解释两件事:为什么它与另一个C库(我自己的,比libgretl简单得多)一起工作?为什么它在编译时失败-名称损坏问题不会首先出现在链接器中吗?尝试查看预处理的源代码,gcc将使用-E开关输出它。可能在C头中有一些#定义会破坏以后的编译(#define namespace…,f.e.)不,名称空间只被使用(就像在原始帖子中一样),从未定义过,或者以其他方式被破坏。我不知道:(猜测“extern”C“inside namespace”在编译器中实现得不是很好。
_GLIBCXX_BEGIN_NAMESPACE(std)
  using ::ptrdiff_t;
  using ::size_t;
_GLIBCXX_END_NAMESPACE