C++11 放置C++;全局命名空间外的libs

C++11 放置C++;全局命名空间外的libs,c++11,namespaces,static-libraries,C++11,Namespaces,Static Libraries,因此,我正在基于opengl、SDL2、ASIMP、glm等其他库构建一个c++11库。。。唯一的问题是,大多数库将其函数或对象放在全局命名空间中:这可能与我的类冲突!(例如,assimp vectors和我的Vector类…)因此我考虑将库放在一个名称空间中,而不是让它们“污染”全局名称空间 我想这样做: namespace some_name_space { #include <some/kind/of/lib> } 命名空间一些\u名称\u空间 { #包括 } 但是我

因此,我正在基于opengl、SDL2、ASIMP、glm等其他库构建一个c++11库。。。唯一的问题是,大多数库将其函数或对象放在全局命名空间中:这可能与我的类冲突!(例如,assimp vectors和我的Vector类…)因此我考虑将库放在一个名称空间中,而不是让它们“污染”全局名称空间

我想这样做:

namespace some_name_space
{
   #include <some/kind/of/lib>
}
命名空间一些\u名称\u空间
{
#包括
}
但是我意识到在全局名称空间中仍然会有库的一部分

对如何实现这一目标有何建议


PS:我可以“包装”LIB,但那真的不可管理

显然,这可能与纯C库有关。然而,这可能不是一个好主意

据我所知,C++并不能为你所要做的事情提供实用工具。最好的选择是将include放在源文件中而不是头文件中,至少对于公开的API是这样。这样,只要在单个源文件中包含的库之间没有任何冲突,就不应该有任何冲突。如果仍然存在冲突,则必须将正在使用的项目分别包装在冲突标题中


也可以考虑将自己的类放入一个命名空间中以减少冲突的可能性。

我猜你想要的是把所有库的函数和类放到一个命名空间中。

在这个答案中,我将使用
gl/gl.h
作为示例

据我所知,行
#include
将被
gl/gl.h
中的所有代码替换

如果要将所有类和函数从
gl/gl.h
移动到命名空间中(例如
gl
),我应该创建一个名为
\uu gl.hpp
的中间文件,其内容如下:

namespace gl {
  using namespace gl; //because gl/gl.h don't know namespace gl
  #include <gl/gl.h>
  //#include more and more kind of libraries which use namespace gl
}
gl名称空间{
使用名称空间gl;//因为gl/gl.h不知道名称空间gl
#包括
//#包括越来越多使用名称空间gl的库
}
然后,在主文件中,使用
#include“u gl.hpp”
而不是
#include

请注意,宏不能移动到
名称空间gl
,因为它们是宏

但别担心,因为:

  • 几乎所有的宏都有一个大写标识符,而几乎所有的非宏都是小写、大写和小写、小写、大写或小写

  • 如果正在重新定义宏,编译器将向您发出警告。所以,您不必担心同名宏


这种方法也适用于
windows.h
和其他一些库,但它不能应用于几乎所有的C/C++标准库。

我是否正确理解您希望将第三方代码移动到命名空间中,并将自己的代码保留在全局命名空间中?我是否可以问您为什么不将自己的代码移动到命名空间中?尤其是你在建图书馆?你会给其他人带来与你在这里试图为自己解决的问题一样的麻烦。因为我不想让用户使用令人沮丧的函数或对象,比如aiVector,而不是我的ex Vector类。我相信这些库的作者也有同样的想法^^问题是我正在创建一个包含库的库…:(@mattmart我想你不必担心这个。因为:1.几乎宏都是大写的(对吧?),是否有任何非宏标识符可能具有相同的名称?2.如果正在重新定义宏,编译器将向您发出警告。例如,从glew…:#定义GlbindVertexAttributeArray,gl…:我不想让用户看到这些标识符;他们可能会弄糟这些标识符…glew是openGL扩展参数,因此它重新定义了一些openGL函数,其中大多数是sta使用小写字母RTIN:(