在标准库中,我发现名称空间std
被声明为宏。
#define _STD_BEGIN namespace std {
#define _STD_END }
Microsoft Visual Studio 9.0\VC\include\yvals.h
中声明。但是我找不到包含这个的STL文件。如果不包括在内,它是如何使用的?有什么想法..?
答案 0 :(得分:6)
可能不是最佳做法,因为与香草namespace
声明相比,它可能难以阅读。也就是说,记住规则并不总是普遍适用,而且我确信在某种情况下宏可能会大大清理。
“但是我找不到包含这个的STL文件。如果没有包含它,它是如何使用的?”。
使用此宏的所有文件都以某种方式包含yvals.h
。例如,<vector>
包括<memory>
,其中包含<iterator>
,其中包含<xutility>
,其中包含<climits>
,其中包含<yvals.h>
。链可能很深,但确实包含它。
我想澄清一下,这仅适用于标准库的这种特定实现;这绝不是标准化的。
答案 1 :(得分:3)
答案 2 :(得分:1)
我想这样做的唯一原因是,如果您希望更改应用程序/库使用的命名空间,或者出于兼容性原因完全禁用命名空间。
答案 3 :(得分:1)
我在最近使用的库中看到的一种方法是:
BEGIN_NAMESPACE_XXX()
其中XXX是命名空间级别的数量,例如:
BEGIN_NAMESPACE_3(ns1, ns1, ns3)
将采用三个参数并扩展为
namespace ns1 {
namespace ns2 {
namespace ns2 {
匹配的END_NAMESPACE_3
会扩展为
}
}
}
(为了清晰起见,我添加了换行符和缩进词)
答案 4 :(得分:0)
我可以看到通过引用为C ++中包含的C库执行此操作(例如,C调用string.h
的头和C ++调用cstring
)。在这种情况下,宏定义将取决于#ifdef _c_plus_plus
。
我不会这样做。我不能想象任何值得使用的编译器不支持命名空间,异常,模板或其他“现代”C ++特性(现代是引号,因为这些特性是在90年代中后期添加的)。事实上,根据我的定义,编译器只有在为各自的语言提供良好支持时才值得使用。这不是语言问题;这是一个简单的例子:“如果我选择语言X,我宁愿使用它,因为它存在于今天,而不是它存在于十年或两年前。”我永远不明白为什么有些项目会花时间尝试支持ANSI C之前的编译器。