将命名空间声明为宏 - C ++

时间:2010-02-25 04:05:14

标签: c++ macros namespaces

在标准库中,我发现名称空间std被声明为宏。

#define _STD_BEGIN  namespace std {
#define _STD_END        }
  1. 这是使用命名空间时的最佳做法吗?
  2. 宏在Microsoft Visual Studio 9.0\VC\include\yvals.h中声明。但是我找不到包含这个的STL文件。如果不包括在内,它是如何使用的?
  3. 有什么想法..?

5 个答案:

答案 0 :(得分:6)

可能不是最佳做法,因为与香草namespace声明相比,它可能难以阅读。也就是说,记住规则并不总是普遍适用,而且我确信在某种情况下宏可能会大大清理。

“但是我找不到包含这个的STL文件。如果没有包含它,它是如何使用的?”。

使用此宏的所有文件都以某种方式包含yvals.h。例如,<vector>包括<memory>,其中包含<iterator>,其中包含<xutility>,其中包含<climits>,其中包含<yvals.h>。链可能很深,但确实包含它。

我想澄清一下,这仅适用于标准库的这种特定实现;这绝不是标准化的。

答案 1 :(得分:3)

  1. 总的来说,这些宏可能是在某些编译器没有实现名称空间时,或者是为了与特定平台兼容时使用的。
  2. 不知道。该文件可能包含在STL文件中包含的其他文件中。

答案 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之前的编译器。