什麼是C++中的「命名空間別名」?它是如何使用的?在C++中,什麼是「命名空間別名」?
126
A
回答
149
命名空間別名是一種通過不同的較短名稱引用長名稱空間名稱的便捷方式。
作爲一個例子,假設您想使用Boost的uBLAS中的數字向量而沒有using namespace
指令。說明完整的命名空間每次都是麻煩的:
boost::numeric::ublas::vector<double> v;
相反,你可以定義一個別名boost::numeric::ublas
- 說我們要縮寫這只是ublas
:很簡單
namespace ublas = boost::numeric::ublas;
ublas::vector<double> v;
6
,中的#define將無法工作。
namespace Mine { class MyClass { public: int i; }; }
namespace His = Mine;
namespace Yours { class Mine: public His::MyClass { void f() { i = 1; } }; }
編譯好。讓您解決名稱空間/類名衝突問題。
namespace Nope { class Oops { public: int j; }; }
#define Hmm Nope
namespace Drat { class Nope: public Hmm::Oops { void f() { j = 1; } }; }
在最後一行,「Hmm:Oops」是一個編譯錯誤。預處理器將其更改爲Nope :: Oops,但Nope已經是類名。
1
它是所有關於選擇的別名爲looong命名空間的名稱,如:
namespace SHORT = NamespaceFirst::NameSpaceNested::Meow
後來的後來,你可以的typedef
typedef SHORT::mytype
而不是
typedef NamespaceFirst::NameSpaceNested::Meow::mytype
這句法僅適用於命名空間,不能包括類,類型namespace NAME =
1
後還要注意,命名空間別名和使用指令是在編譯時解析,無法運行時間。 (更具體地說,它們都是用來告訴編譯器在解析名稱時還有什麼地方需要查看的工具,如果它無法在當前作用域或其任何父作用域中找到特定符號)。例如,這些都不會編譯:
namespace A {
int foo;
namespace AA {
int bar;
} // namespace AA
namespace AB {
int bar;
} // namespace AB
} // namespace A
namespace B {
int foo;
namespace BA {
int bar;
} // namespace BA
namespace BB {
int bar;
} // namespace BB
} // namespace B
bool nsChooser1, nsChooser2;
// ...
// This doesn't work.
namespace C = (nsChooser1 ? A : B);
C::foo = 3;
// Neither does this.
// (Nor would it be advisable even if it does work, as compound if-else blocks without braces are easy to inadvertently break.)
if (nsChooser1)
if (nsChooser2)
using namespace A::AA;
else
using namespace A::AB;
else
if (nsChooser2)
using namespace B::BA;
else
using namespace B::BB;
現在,好奇的心態可能已經注意到,constexpr
變量也用於在編譯時,並想知道是否可以在任何一個別名或指令一起使用。據我所知,他們不能,雖然我可能對此有錯。如果您需要在不同命名空間中使用命名相同的變量,並動態選擇它們,則必須使用引用或指針。
// Using the above namespaces...
int& foo = (nsChooser1 ? A::foo : B::foo);
int* bar;
if (nsChooser1) {
if (nsChooser2) {
bar = &A::AA::bar;
} else {
bar = &A::AB::bar;
}
} else {
if (nsChooser2) {
bar = &B::BA::bar;
} else {
bar = &B::BB::bar;
}
}
上述的有用性可能會受到限制,但它應該達到目的。
(對於上面我可能錯過的任何錯誤,我很抱歉。)
相關問題
- 1. C++中的命名空間別名
- 2. C++中的名稱空間別名的作用域是什麼?
- 3. 什麼是aerospike中的命名空間
- 4. 別名衝突命名空間c#
- 5. C++命名空間....匿名命名空間是合法的?
- 6. 在C#中使用名稱空間別名有什麼好處?
- 7. Rake命名空間別名
- 8. ExtJs命名空間別名
- 9. 命名空間點命名空間和嵌套命名空間有什麼區別?
- 10. 在C++中可以重命名/別名非命名空間,非類名?
- 11. IMvcServiceLocator的命名空間是什麼?
- 12. testng.xml的命名空間是什麼?
- 13. 什麼是groovyx命名空間?
- 14. 什麼是OpenCV HighGUI命名空間?
- 15. 什麼是DomDocument命名空間?
- 16. 什麼是MapRoute命名空間參數?
- 17. DispatcherTimer類的命名空間是什麼?
- 18. 什麼是ksoap命名空間?
- 19. 什麼是命名空間,XPath軸
- 20. 什麼是「kube-system」命名空間?
- 21. 命名空間是什麼?用法呢?
- 22. 什麼是CreateIfNotExists的命名空間?
- 23. NUnit CollectionAssert的命名空間是什麼?
- 24. 什麼是VJSharp命名空間?
- 25. F#中的命名空間別名?
- 26. Oxygene中的命名空間別名
- 27. XAML命名空間的最佳命名約定是什麼?
- 28. Doctrine2中的實體名稱空間和別名是什麼?
- 29. 什麼是C++中使用的命名空間?
- 30. 是否有可能顛倒c#命名空間的別名?
爲了可能解釋downvotes,SO不是和永遠不會成爲一個好的C++教科書的替代品。您提出的問題將由任何此類書籍回答。回答你自己的問題的SO「特徵」不應該被用來提供這些書的解釋。 – 2009-07-31 09:02:19
沒有采取任何行動...只是爲了解釋我爲什麼這樣做:這是我從播客中的Joel的評論中瞭解到,即使是「入門級」的問題也是對SO的公平遊戲,並且提出問題和答案是可以接受的如果那些內容不是以可訪問的形式存在,那麼你自己呢。但顯然,這是皺眉? – 2009-07-31 09:17:06