使用聲明類型的命名空間與使用命名空間的命令類型有什麼用?何時使用它們中的每一個?C++中的命名空間
1
A
回答
2
命名空間指令的聲明類型在您的代碼作用域中引入了選定的命名符號(並且在沒有命名空間限定符的情況下使來自同一名稱空間的其他符號無法訪問)。
命名空間指令的使用類型將名稱空間中的所有符號引入到代碼範圍內 - 這意味着您不一定確切知道引入了哪些符號(可能有未記錄的符號或先前遺留的符號該庫的版本,或...)。
- 對於控件,使用聲明類型的命名空間指令。
- 爲了方便(有風險),使用using類型的命名空間指令。
2
除了使用聲明允許訪問符號而不是命名空間外,using聲明還將符號帶入聲明的範圍。 using指令隻影響查找。
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
,並允許基礎類型的易變化太大。
相關問題
- 1. C++中的命名空間
- 2. C#中的命名空間#
- 3. c中的命名空間#
- 4. c中的命名空間#
- 5. 全局命名空間中的命名空間C#
- 6. C++命名空間
- 7. C++命名空間....匿名命名空間是合法的?
- 8. C++中的命名空間別名
- 9. C#完全限定的命名空間與小命名空間
- 10. C-命名空間部分
- 11. XML命名空間,C#
- 12. C#命名空間指南
- 13. C++命名空間幫助
- 14. 命名空間C#.NET
- 15. 命名空間confilcts .NET C++
- 16. C++組合命名空間
- 17. C++命名空間導出
- 18. C++命名空間函數
- 19. C++命名空間問題
- 20. C++ 「命名空間內」
- 21. 命名空間用C
- 22. C#命名空間搜索
- 23. C++ - 類與命名空間
- 24. C++宏和命名空間
- 25. C++命名空間trobles
- 26. C#DataSet命名空間
- 27. C#命名空間問題
- 28. C#命名空間問題
- 29. C#和命名空間
- 30. ANTLR v3 C#命名空間
它還調整訪問權限。 – Potatoswatter 2010-04-04 02:37:23