[英]Declaring namespace as macro - C++
在標准庫中,我發現命名空間std
被聲明為一個宏。
#define _STD_BEGIN namespace std {
#define _STD_END }
Microsoft Visual Studio 9.0\\VC\\include\\yvals.h
。 但是我找不到包括這個的 STL 文件。 如果不包含,如何使用?有什么想法嗎..?
可能不是最佳實踐,因為與普通namespace
聲明相比,它可能難以閱讀。 也就是說,請記住規則並不總是普遍適用,而且我確信在某些情況下,宏可能會大大清理內容。
“但是我找不到包含這個的STL文件。如果不包含,如何使用?”。
使用此宏的所有文件yvals.h
以某種方式包含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,我更願意使用它現在的樣子,而不是十年前或兩年前的樣子。” 例如,我一直不明白為什么有些項目要花時間來支持 pre-ANSI C 編譯器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.