2015-06-25 61 views
5

所以我正在構建一個基於其他庫如opengl,SDL2,assimp,glm等的C++ 11庫......唯一的問題是大多數這些庫放置它們的函數,或全局命名空間中的對象:這可能與我的類發生衝突! (例如,assimp矢量和我的Vector類...)所以我想將這些庫放在一個名稱空間中,而不是將它們留在那裏來「污染」全局名稱空間。將C++庫放在全局命名空間之外

我想這樣做的:

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

但我意識到,仍然會存在在全局命名空間的庫的一部分!

有關如何實現這一目標的任何建議? PS:我可以「包裝」庫,但那不會真的是可管理的!

+1

我理解你是否想將**第三方**代碼移動到命名空間中,並將**自己的**代碼留在全局命名空間中? – Siguza

+0

是的,就是這樣:) – MattMatt

+0

我可以問你爲什麼不把自己的代碼移動到命名空間中呢?特別是因爲你正在建立一個圖書館?你會讓別人遇到同樣的麻煩,你要爲自己解決這個問題。 – Siguza

回答

2

我想你想要的是將所有庫的函數和類放入一個名稱空間。

在這個答案中,我將以gl/gl.h爲例。

據我所知,行#include <gl/gl.h>將被gl/gl.h的所有代碼替換。

如果你想從 gl/gl.h所有類和功能移動到一個命名空間( gl例如),我應該創建一個內容叫 __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 
} 

然後,在你的主文件,請使用#include "__gl.hpp"而不是#include <gl/gl.h>

請注意,宏可能不會被移動到namespace gl,因爲它們是宏。

不過不用擔心,因爲:

  • 幾乎宏有一個大寫字母標識符和幾乎不宏都是小寫或UpperAndLowerCase或lowerAndUpperCase或lower_case_and_underscore ...

  • 如果宏被重新定義,編譯器會給你一個警告。所以,你不必擔心同名宏。

這種方式也適用於windows.h以及一些其他的庫,但它不能應用於幾乎C/C++標準庫。

+0

謝謝;標記爲aswer :) – MattMatt

+0

但問題是,我使用glew ...幾乎所有被定義爲一個宏... – MattMatt

+0

@MattMatt我認爲你不必擔心這一點。因爲:1.幾乎宏是COMPLETELY_UPPERCASE(對嗎?),是否有任何非宏標識符可能具有相同的名稱? 2.如果正在重新定義一個宏,編譯器會警告你。 – DMaster

1

顯然,這可能與純C庫有關。但是,這可能不是一個好主意。

據我所知,C++並沒有提供你想要做的事情。你最好的選擇就是把這些包含在源文件中,而不是頭文件中,至少對於公開的API來說。這樣就不會有任何衝突,只要在包含在單個源文件中的庫之間沒有任何衝突。如果仍存在衝突,您將不得不分別在相沖突的標題中包裝您正在使用的項目。另外,您可以考慮在命名空間中放置自己的類,以減少衝突的可能性。

+0

是的,我不知道我是否有一個選擇,然後... – MattMatt