C++ 将名称空间声明为宏-C++;
在标准库中,我发现名称空间C++ 将名称空间声明为宏-C++;,c++,macros,namespaces,C++,Macros,Namespaces,在标准库中,我发现名称空间std被声明为宏 #define _STD_BEGIN namespace std { #define _STD_END } 这是使用名称空间时的最佳实践吗 宏在Microsoft Visual Studio 9.0\VC\include\yvals.h中声明。但是我找不到包含这个的STL文件。如果不包括,如何使用 有什么想法吗 通常不会。宏可能是在某些编译器没有实现名称空间时使用的,或者是为了与特定平台兼容 不知道。该文件可能会包含在STL文件中的其
std
被声明为宏
#define _STD_BEGIN namespace std {
#define _STD_END }
我认为这样做的唯一原因是,如果您想使更改应用程序/库使用的命名空间变得容易,或者出于兼容性原因完全禁用命名空间。可能不是最佳做法,因为与普通的
命名空间
声明相比,它可能很难阅读。也就是说,请记住,规则并不总是普遍适用的,我相信在某些情况下,宏可能会大幅度地清理问题
“但我找不到包含此文件的STL文件。如果未包含此文件,如何使用它?”
所有使用此宏的文件都包括yvals.h
。例如
包括
,其中包括
,其中包括
,其中包括
,其中包括
。这条链条可能很深,但它确实包含了一些要点
我想澄清一下,这只适用于标准库的这个特定实现;这绝不是标准化的。我在最近使用的库中看到的一种方法是:
BEGIN_NAMESPACE_XXX()
其中XXX是命名空间级别的数量,例如:
BEGIN_NAMESPACE_3(ns1, ns1, ns3)
将接受三个参数并扩展到
namespace ns1 {
namespace ns2 {
namespace ns2 {
}
}
}
匹配的END\u名称空间\u 3
将扩展到
namespace ns1 {
namespace ns2 {
namespace ns2 {
}
}
}
(我只为明了的缘故添加了新行和缩进)
< P>我可以看到C++中包含的C库的引用(例如,C调用Cord:Ctring,H.<代码),C++调用< Cord>cString < /C> >。在这种情况下,宏定义将取决于\ifdef\u c\u plus\u plus
我一般不会这么做。我想不出任何一个编译器都不支持名字空间、异常、模板或其他“现代”C++特性(现代是引用的,因为这些特性在90年代中后期加入)。事实上,根据我的定义,编译器只有在为各自的语言提供良好支持的情况下才值得使用。这不是语言问题;这是一个简单的例子,“如果我选择了X语言,我更愿意按照现在的情况使用它,而不是像十年或二十年前那样。”例如,我一直不明白为什么有些项目会花时间尝试支持ANSI C之前的编译器。谢谢。我检查过,找不到包括此文件在内的其他文件。在C++11及更高版本中,使用此文件对库的版本非常有用。基本上,只要ABI兼容性被破坏,宏就会更改内联命名空间的名称。