std :: string源中宏的用法

时间:2019-02-28 20:01:05

标签: c++ string std

我正在编写一些使用std :: string的c ++代码。
我想看看代码是怎么写的,所以我进入了源代码。 (Ctrl +左键单击)。
我注意到,到处都有宏。
该代码甚至以:

结尾
_STD_END
// Corresponds to: #define _STD_END }

我了解了为什么宏有用,并且将它们用于我自己的Log.hpp文件,但是我不明白为什么有人会使用_STD_END之类的宏而不是仅仅编写}

为了澄清,我的问题是为什么他的std :: string作者P.J. Plauger决定以这种方式使用宏,如果我也应该这样做?

2 个答案:

答案 0 :(得分:3)

这实际上是一个非常简单的原因。在具有嵌套名称空间的大型代码库中,很难确定代码中裸露的右括号。作者可以使用

} // end std namespace

但这是很多打字。

相反,他们给std命名空间的右括号命名为(_STD_END),因此在查看代码时很容易看到std的结尾


如果您仔细阅读代码库,可能会发现_STD_BEGIN定义为

#define _STD_BEGIN namespace std {

然后他们可以像这样打开和关闭名称空间

_STD_BEGIN
    // lots of code
_STD_END

// more code that shouldn't be in std

_STD_BEGIN
    // more code needed in std
_STD_END

答案 1 :(得分:1)

这是Microsoft许可的Dinkumware库(尽管他们最近已经接管了其版本的完整维护)。 _STD_BEGIN_STD_END宏用于自定义std命名空间。有些编译器不(不是?)不支持名称空间。对于那些编译器,宏扩展为空。一些编译器需要某种间接方式,并且这些宏扩展为指令,这些指令将代码放入特定于实现者的名称空间(即,名称下划线后跟大写字母的名称空间),使用或不可以使用-directive将该名称空间的内容提取到std中。而且在许多情况下,它们分别扩展为明显的普通namespace std {}

简而言之,它们是关于多平台库实现的可配置性。

我在Dinkumware工作了很多年,所以我有第一手知识。