2010-02-25 211 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之前的编译器。