在标准库中,我发现名称空间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兼容性中断,您的宏就会更改内联命名空间的名称。 –