在家没事,看看boost的代码

其实也谈不上读代码,只不过前段时间用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 <boost/config/auto_link.hpp>

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决定了。这样,在编译的时候,就可以根据操作系统、编译器、选项的不同而确定应该链接到那个库了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值