簡體   English   中英

將命名空間聲明為宏 - C++

[英]Declaring namespace as macro - C++

在標准庫中,我發現命名空間std被聲明為一個宏。

#define _STD_BEGIN  namespace std {
#define _STD_END        }
  1. 這是使用命名空間時的最佳實踐嗎?
  2. 該宏在Microsoft Visual Studio 9.0\\VC\\include\\yvals.h 但是我找不到包括這個的 STL 文件。 如果不包含,如何使用?

有什么想法嗎..?

可能不是最佳實踐,因為與普通namespace聲明相比,它可能難以閱讀。 也就是說,請記住規則並不總是普遍適用,而且我確信在某些情況下,宏可能會大大清理內容。

“但是我找不到包含這個的STL文件。如果不包含,如何使用?”。

使用此宏的所有文件yvals.h以某種方式包含yvals.h 例如<vector>包括<memory> ,其中包括<iterator> ,其中包括<xutility> ,其中包括<climits> ,其中包括<yvals.h> 鏈條可能很深,但它確實包含了某些點。

我想澄清一下,這僅適用於標准庫的這個特定實現; 這絕不是標准化的。

  1. 通常不會。宏可能在某些編譯器未實現命名空間時使用,或者用於與特定平台的兼容性。
  2. 不知道。 該文件可能會被包含在 STL 文件中的其他文件所包含。

我在最近使用的圖書館中看到的一種方法是:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM