STL源码中对Namespace的条件编译

现代程序猿们对Namespace(命名空间)的使用已经习以为常了,而且现在的编译器对Namespace肯定都有比较好的支持。但是有没有想过在很遥远的某个年代,当时编译器并不支持Namespace?这种情况当然是存在的,所以为了保持向后兼容性,STL中使用了条件编译。

最近读STL源码(SGI版本)的时候发现了一种很奇怪的情况:有些头文件中包含了“__STL_BEGIN_NAMESPACE”和“__STL_END_NAMESPACE”这样不伦不类的语句,而且编辑器在下面加上了下划线,显然是编辑器所不能解析的。

在网上搜索了一下,发现原因如下:

#ifndef __SGI_STL_INTERNAL_ITERATOR_H
#define __SGI_STL_INTERNAL_ITERATOR_H

 __STL_BEGIN_NAMESPACE

struct input_iterator_tag {};
。。。。。。。。。。。。
这段代码来自sgi stl中 stl_iterator.h
请问各位高手,这段代码中的__STL_BEGIN_NAMESPACE是干什么用的,放在这里不会出错吗?

 

答案1:

看stl_config.h:
00205 # if defined(__STL_USE_NAMESPACES) && !defined(__STL_NO_NAMESPACES)
00206 #   define __STD std
00207 #   define __STL_BEGIN_NAMESPACE namespace std {
00208 #   define __STL_END_NAMESPACE }
00209 #   define  __STL_USE_NAMESPACE_FOR_RELOPS
00210 #   define __STL_BEGIN_RELOPS_NAMESPACE namespace std {
00211 #   define __STL_END_RELOPS_NAMESPACE }
00212 #   define __STD_RELOPS std
00213 # else
00214 #   define __STD
00215 #   define __STL_BEGIN_NAMESPACE
00216 #   define __STL_END_NAMESPACE
00217 #   undef  __STL_USE_NAMESPACE_FOR_RELOPS
00218 #   define __STL_BEGIN_RELOPS_NAMESPACE
00219 #   define __STL_END_RELOPS_NAMESPACE
00220 #   define __STD_RELOPS
00221 # endif

在支持namespace的环境下,配合__STL_END_NAMESPACE使用namespace std
namespace std{ //__STL_BEGIN_NAMESPACE
...
} //__STL_END_NAMESPACE

答案2:

__STL_BEGIN_NAMESPACE宏是在某个配置文件中定义的,就sgi来说,此宏为了兼容一些早期代码,允许stl模板库不是用std命名空间包裹,__STL_BEGIN_NAMESPACE根据用户配置,被定义为“空”或者“namespace std {”之类的实际代码。

 

我查看了一下,在STL所有底层文件中(以"stl_"开始的头文件)几乎都含有这两个宏,文件开始时会包含“__STL_BEGIN_NAMESPACE”,结尾处会包含“__STL_END_NAMESPACE”。这样,在支持Namespace的用户环境下会被转换成 namespace std { },在不支持Namespace的用户环境下会被忽略。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值