将C ++库放在全局命名空间之外

时间:2015-06-25 12:36:52

标签: c++11 namespaces static-libraries

所以我正在建立一个基于其他库的c ++ 11库,比如opengl,SDL2,assimp,glm等......唯一的问题是这些库中的大多数都将它们的功能或对象放在全局中命名空间:这可能与我的课程冲突! (例如,assimp向量和我的Vector类...)所以我想把库放在一个命名空间中,而不是让它们留在那里去"污染"全局命名空间。

我想过这样做:

namespace some_name_space
{
   #include <some/kind/of/lib>
}

但我意识到在全局命名空间中仍然会有一部分库!

关于如何实现这一点的任何建议?

PS:我可以&#34;包裹&#34; libs,但那不可能是可管理的!

2 个答案:

答案 0 :(得分:2)

我想你想要的是将所有库的函数和类放入命名空间。

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

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

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

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
}

然后,在您的主文件中,使用#include "__gl.hpp"代替#include <gl/gl.h>

请注意,宏可能无法移动到namespace gl,因为它们是宏的。

但不要担心,因为:

  • 几乎所有的宏都有一个UPPERCASE标识符,而且几乎所有非宏都是小写或者是UpperAndLowerCase或者是lowerAndUpperCase或者是lower_case_and_underscore ......

  • 如果正在重新定义宏,编译器会给出警告。所以,你不必担心同名宏。

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

答案 1 :(得分:1)

显然,这可以用于纯C库。但是,这可能不是一个好主意。

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

此外,您可以考虑将自己的类放在命名空间中以减少冲突的可能性。