2010-02-25 192 views
5

在標準庫中,我發現名稱空間std被聲明爲宏。將名稱空間聲明爲宏 - C++

#define _STD_BEGIN namespace std { 
#define _STD_END  } 
  1. 使用命名空間時,這是一個最好的做法呢?
  2. 該宏在Microsoft Visual Studio 9.0\VC\include\yvals.h中聲明。但是我找不到包含這個的STL文件。如果沒有包含,如何使用?

任何想法..?

回答

6

可能不是最佳做法,因爲與香草namespace聲明相比,它可能難以閱讀。也就是說,記住規則並不總是適用,我相信有一些情況下宏可能會大大地清理。

「但是我找不到包含這個的STL文件,如果沒有包含它,它如何使用?」。

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

我想澄清的是,這隻適用於標準庫的這個特定實現;這不是標準化的。我在我最近使用的庫看到

+0

+1有很好的解釋。希望我能匹配! –

+0

在C++ 11及更高版本中,這對於使用[內聯名稱空間](http://en.cppreference.com/w/cpp/language/namespace#Inline_namespaces)對庫進行版本化非常有用。基本上,只要ABI兼容性中斷,您的宏就會更改內聯命名空間的名稱。 –

3
  1. 一般情況編號當某些編譯器沒有實現名稱空間或者與特定平臺兼容時,可能會使用這些宏。
  2. 不知道。該文件可能會包含在STL文件中的其他文件中。
+0

謝謝。我檢查並找不到其他文件,包括這個文件。 –

1

我想象的唯一原因要做到這一點,如果你想很容易改變你的應用程序/庫使用的命名空間,或完全禁用命名空間兼容性的原因。

1

一種方法是:

BEGIN_NAMESPACE_XXX() 

其中XXX是例如命名空間的級別數:

BEGIN_NAMESPACE_3(ns1, ns1, ns3) 

將採取三個參數,並擴大到

namespace ns1 { 
    namespace ns2 { 
     namespace ns2 { 

和匹配END_NAMESPACE_3將擴大到

 } 
    } 
} 

(我已經添加了清晰的唯一緣故換行和縮進)

0

我能看到參考做這包括在C C庫++(例如,標題是C調用string.h並且C++調用cstring)。在這種情況下,宏定義將取決於#ifdef _c_plus_plus

我不會這樣做的一般。我想不出任何值得使用的編譯器,它不支持命名空間,例外,模板或其他「現代」C++功能(現代引用是因爲這些功能是在90年代中後期添加的)。實際上,按照我的定義,編譯器只有在爲各自的語言提供良好支持的情況下才值得使用。這不是一個語言問題;這是一個簡單的例子:「如果我選擇X語言,我更願意使用它,因爲它現在存在,而不是像十年或兩年前存在的那樣。」例如,我從未明白爲什麼有些項目花費時間嘗試支持ANSI C之前的編譯器。