您的位置:首页 > 编程语言

在家没事,看看boost的代码

2008-04-01 16:42 246 查看
其实也谈不上读代码,只不过前段时间用boost的date_time库用得很频繁,发现它总是可以自行提示需要link到哪些库,一直觉得不解。今天没事,干脆追踪一下,看看到底是怎么实现的。

其实所谓追踪,有点像人工智能里面的width-first search:date_time库默认引用的是一个头文件
#include "boost/date_time/gregorian/gregorian.hpp"

这个文件,当然,只不过是在引用其它的文件
#include "boost/date_time/gregorian/gregorian_types.hpp"
#include "boost/date_time/gregorian/formatters.hpp"
#include "boost/date_time/gregorian/greg_facet.hpp"
#include "boost/date_time/gregorian/parsers.hpp"

没有关系,继续追,不过这次不是盲目的,先看看他们都include了什么,gregorian_types.hpp似乎没有引用什么有趣的东西;formatters.hpp也没有;greg_facet.hpp还是没有;但是parsers.hpp里面是这样的
#include "boost/date_time/gregorian/gregorian_types.hpp"
#include "boost/date_time/date_parsing.hpp"
#include "boost/date_time/compiler_config.hpp"
#include "boost/date_time/parse_format_base.hpp"

其中compiler_config.hpp看起来很像是有点意思的,可以继续看看。
文件很短,前面的bla, bla, bla ... 看到这一句
#define BOOST_LIB_NAME boost_date_time

哈哈,这不就是date_time的库文件名字的一部分么?且看看谁用了这个东西,果然没过几行,有
//
// And include the header that does the work:
//
#include

auto_link! that's what we want! 打开一看,豁然开朗。这个文件利用preprocessor确定操作系统,编译器,链接选项(dynamic vs static, debug vs release...),然后把这些拼接起来,最终送到这一句

#  pragma comment(lib, BOOST_LIB_PREFIX BOOST_STRINGIZE(BOOST_LIB_NAME) "-" BOOST_LIB_TOOLSET BOOST_LIB_THREAD_OPT BOOST_LIB_RT_OPT "-" BOOST_LIB_VERSION ".lib")

大写的当然都是macro,它们的值在前面由preprocessor决定了。这样,在编译的时候,就可以根据操作系统、编译器、选项的不同而确定应该链接到那个库了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: