2010-04-04 191 views
1

使用聲明類型的命名空間與使用命名空間的命令類型有什麼用?何時使用它們中的每一個?C++中的命名空間

回答

2

命名空間指令的聲明類型在您的代碼作用域中引入了選定的命名符號(並且在沒有命名空間限定符的情況下使來自同一名稱空間的其他符號無法訪問)。

命名空間指令的使用類型將名稱空間中的所有符號引入到代碼範圍內 - 這意味着您不一定確切知道引入了哪些符號(可能有未記錄的符號或先前遺留的符號該庫的版本,或...)。

  • 對於控件,使用聲明類型的命名空間指令。
  • 爲了方便(有風險),使用using類型的命名空間指令。
2

除了使用聲明允許訪問符號而不是命名空間外,using聲明還將符號帶入聲明的範圍。 using指令隻影響查找。

+0

它還調整訪問權限。 – Potatoswatter 2010-04-04 02:37:23

0

Jonathan已經恢復using namespace foo;using foo::Bar;之間的差異,但我認爲他的答案很不完整。

第一個:using namespace應該永遠不會出現在頭文件中。通過這樣做,你可能會使它不可能與其他頭文件結合使用,因爲符號衝突...

第二:一般來說,你應該儘量限制符號的範圍,儘可能地已經做一邊寫代碼:

for (size_t i = 0; i < 5; ++i) 
{ 
    std::string myString = myVec.at(i); 
    if (myString == "Foo") { std::cout << "Found"; break; } 
} 

這將是無用的(和污染)有聲明的for循環外myString。事實上,這個建議可以在許多書中找到:

From Scott Meyers'Effective C++,Item 26:儘可能推遲變量定義

從香草薩特和安德烈Alexandrescu的的C++ Coding Standard,項目18:變量聲明爲本地儘可能

沒有理由不這樣做與using聲明。

第三:考慮using的替代方案:名稱空間別名和typedef

// foo.h 

class Foo 
{ 
public: 

    std::vector<std::string> getSynonyms(const std::string& s) const; 

private: 
    typedef std::map< std::string, std::vector<std::string> > synonyms_type; 
    synonyms_type mSynonyms; 
}; 

// foo.cpp (never in header, at general scope) 

namespace fu = boost::fusion; 

std::vector<std::string> Foo::getSynonyms(const std::string& s) const 
{ 
    synonyms_type::const_iterator it = 
    std::find(mSynonyms.begin(), mSynonyms.end(), s); 

    std::vector<std::string> result; 
    if (it != mSynonyms.end()) { result = it->second; } 

    return result; 
} 

有什麼優點?

  • 命名空間走樣>鍵入減少幾乎一樣多,而不注入類型在當前範圍權利,使沒有風險
  • 的typedef>鍵入減少超過using,並允許基礎類型的易變化太大。