在標準庫中,我發現名稱空間std
被聲明爲宏。將名稱空間聲明爲宏 - C++
#define _STD_BEGIN namespace std {
#define _STD_END }
- 使用命名空間時,這是一個最好的做法呢?
- 該宏在
Microsoft Visual Studio 9.0\VC\include\yvals.h
中聲明。但是我找不到包含這個的STL文件。如果沒有包含,如何使用?
任何想法..?
在標準庫中,我發現名稱空間std
被聲明爲宏。將名稱空間聲明爲宏 - C++
#define _STD_BEGIN namespace std {
#define _STD_END }
Microsoft Visual Studio 9.0\VC\include\yvals.h
中聲明。但是我找不到包含這個的STL文件。如果沒有包含,如何使用?任何想法..?
可能不是最佳做法,因爲與香草namespace
聲明相比,它可能難以閱讀。也就是說,記住規則並不總是適用,我相信有一些情況下宏可能會大大地清理。
「但是我找不到包含這個的STL文件,如果沒有包含它,它如何使用?」。
使用此宏的所有文件都以某種方式包含yvals.h
。例如,<vector>
包括<memory>
,其包括<iterator>
,其包括<xutility>
,其包括<climits>
,其包括<yvals.h>
。鏈條可能很深,但它確實包括它一點。
我想澄清的是,這隻適用於標準庫的這個特定實現;這不是標準化的。我在我最近使用的庫看到
謝謝。我檢查並找不到其他文件,包括這個文件。 –
我想象的唯一原因要做到這一點,如果你想很容易改變你的應用程序/庫使用的命名空間,或完全禁用命名空間兼容性的原因。
一種方法是:
BEGIN_NAMESPACE_XXX()
其中XXX是例如命名空間的級別數:
BEGIN_NAMESPACE_3(ns1, ns1, ns3)
將採取三個參數,並擴大到
namespace ns1 {
namespace ns2 {
namespace ns2 {
和匹配END_NAMESPACE_3
將擴大到
}
}
}
(我已經添加了清晰的唯一緣故換行和縮進)
我能看到參考做這包括在C C庫++(例如,標題是C調用string.h
並且C++調用cstring
)。在這種情況下,宏定義將取決於#ifdef _c_plus_plus
。
我不會這樣做的一般。我想不出任何值得使用的編譯器,它不支持命名空間,例外,模板或其他「現代」C++功能(現代引用是因爲這些功能是在90年代中後期添加的)。實際上,按照我的定義,編譯器只有在爲各自的語言提供良好支持的情況下才值得使用。這不是一個語言問題;這是一個簡單的例子:「如果我選擇X語言,我更願意使用它,因爲它現在存在,而不是像十年或兩年前存在的那樣。」例如,我從未明白爲什麼有些項目花費時間嘗試支持ANSI C之前的編譯器。
+1有很好的解釋。希望我能匹配! –
在C++ 11及更高版本中,這對於使用[內聯名稱空間](http://en.cppreference.com/w/cpp/language/namespace#Inline_namespaces)對庫進行版本化非常有用。基本上,只要ABI兼容性中斷,您的宏就會更改內聯命名空間的名稱。 –