不同的编译器对于template的支持不同的,boost对于不同的编译器是不同编译方法,因此开始特别强调本人使用的编译环境:本文使用的编译器版本为为VC 8.0, (主流了国人都是用visual studio的了,如果你用的不是visual studio本人写的读boost笔记对你就没有太大用了)
此外本笔记使用的是boost源代码的1.0版本,因为本人在阅读源代码的时候可能会对源代码进行改动,所以行号有所改动,但是相差不大了。在周围找找准能找到的
在阅读本文前,建议大家能够调配好boost,配置boost网络上一堆文章。我就不罗嗦了
言归正传,现在先来谈谈boost是怎么区分编译器的。 boost/config.hpp line:29
// if we don't have a compiler config set, try and find one:
#if !defined(BOOST_COMPILER_CONFIG) && !defined(BOOST_NO_COMPILER_CONFIG) && !defined(BOOST_NO_CONFIG)
# include <boost/config/select_compiler_config.hpp>
#endif
也就是说我们找到了怎么设置编译器的头文件了,秘密就在 boost/config/select_compiler_config.hpp中在boost/config/select_compiler_config.hpp line:39 后我们可以看到有许多的#if defined等与编译头,就是对于不同的编译器进行选择了。
原来编译器默认会设置一些宏,我们可以根据这些宏来选择编译器,当然了亲爱vc一贯是受到鄙视的,我们在boost/config/select_compiler_config.hpp line:103,也就是最后一个重终于发现了亲爱的vc了
#elif defined _MSC_VER
// Microsoft Visual C++
//
// Must remain the last #elif since some other vendors (Metrowerks, for
// example) also #define _MSC_VER
# define BOOST_COMPILER_CONFIG "boost/config/compiler/visualc.hpp"
原来vc的编译器会设置的宏如下
_MSC_VER vc的版本号 1400表示vc8 _MSC_FULL_VER vc的具体版本号,这个似乎比上一个更加细
根据判断_MSC_VER可以判断我们使用的就是亲爱的vc了~~接下来我们就来到了boost/config/compiler/visualc.hpp文件中 boost/config/compiler/visualc.hpp 是对于vc各个版本的具体细分,可以看到
boost/config/compiler/visualc.hpp line: 78
boost/config/compiler/visualc.hpp line: 78
#if _MSC_VER <= 1400 // 1400 == VC++ 8.0
# define BOOST_NO_MEMBER_TEMPLATE_FRIENDS
#endif
#if _MSC_VER <= 1500 // 1500 == VC++ 9.0
# define BOOST_NO_TWO_PHASE_NAME_LOOKUP
#endif
我们亲爱的vc8仅仅不支持全部特性中的2个特性,算是很牛的了。呵呵关于不同的版本的vc分别支持什么特性我们通过阅读boost/config/compiler/visualc.hpp就可以得出了。呵呵