2012-02-28 41 views
7

在stlport的庫中,我看到這樣的代碼:STLPORT:namespace std {}是什麼意思?

namespace std { } 
namespace __std_alias = std; 

1.他們試圖抵消在第一線的標準std命名空間?
2.爲什麼在世界上他們會用一個更長的別名代替原來的名字?

+5

'namespace std {}'不會使'std'無效,它只是不加任何東西:)而且,當然,將名稱帶入作用域。 – 2012-02-28 13:17:19

+0

好的,只是把它放到文件的範圍內,命名空間的內容保持不變。花括號{}}只是爲了在那裏。他們既不向命名空間追加任何東西,也不會帶走任何東西。謝謝! – Nav 2012-02-28 13:21:32

回答

8

在爲其聲明別名之前,您需要「範圍內」的命名空間。空的namespace std {}通知編譯器名稱空間存在。然後他們可以爲它創建一個別名。

除了創建快捷方式之外,還有創建別名的原因。例如,您可以定義一個宏來「重命名」命名空間 - 考慮#define std STLPORT_std的影響。只要您使用頭文件播放正確的排序遊戲,使用別名可以訪問原始名稱空間。

3
  1. 不,這只是確保名稱空間的名稱在當前作用域中可用。您可以隨時打開和關閉命名空間,而不會影響命名空間的內容。

  2. 我猜想,所以他們可以很容易地改變他們的庫實現在::std以外的名稱空間(通過將__std_alias更改爲其他別名)。例如,如果你想測試兩個並行的實現,這會很有用。

0

除了什麼D.Shawley說,前聲明一個類,這是一個命名空間內需要相同的語法:

namespace std 
{ 
    template <typename T> 
    class vector; 
} 
+0

你的例子唯一的問題是vector有第二個參數,分配器,所以這個前向聲明可能會讓你後來陷入麻煩。 – CashCow 2012-02-28 13:37:47

+0

我同意矢量不是最好的例子,我只是想要我們都知道和愛的東西:) – 2012-02-28 13:40:01

2

這是相當煩人得到一個編譯器錯誤,有沒有這樣的命名空間爲std ...編譯器在想什麼?當然它存在!

嗯是的,但與庫功能一樣,它必須首先聲明。這是第一行正在做的事情。

隨着__std_alias的重命名,它允許它們爲命名空間提供一個新的別名。你可能決定在你自己的代碼中做這件事。

也許你想在你的代碼中使用shared_ptr,但不想把你的代碼奉獻給使用命名空間boost或std。所以你可以創建一個別名,並以boost或std「指向」它。與以後成爲標準的boost庫中的其他功能一樣。

這並不意味着你使用這個命名空間的所有事情,因爲你可以有多個別名,並且你可以有多個指向相同的真實命名空間。

假設我們想調用我們的智能指針庫sml。我們可以從代碼(相同的標題),這一點做

namespace sml = boost; // or std 

在代碼的一個地方,#include <boost/shared_ptr.hpp>

我們的代碼中的其他地方我們使用sml::shared_ptr。如果我們從boost轉換到std,只需更改一個頭文件,而不是所有的代碼。