好久没有谈论boost log这个话题了。前两天突然发之前由于粗心,忽略了一些问题。
之前为了引用方便,将这个转换成header only。header only的好处就是-- 使用时不用额外的link动态库。这样应用它的时候更加方便。坏处就是 -- 增加重新编译的时间。
这都不是关键。 为了实现logger 功能的全局可见。 首先想到的就是用单例模式。然而单例模式如果不是header only的话实现起来很简单。有个static 的getInstance方法,返回一个static的变量。但是问题就出现再这个变量上。
众所周知,当一个普通的C++变量被static修饰的时候,会改变两个属性 -- 第一个就是变量会预先分配内存, 第二个就是改变它的连接属性。换句话说我们可以再头文件里边写一个static变量,但是当有其他cpp文件include这个文件的时候,每编译一个cpp文件,就会生成一个独立的static变量。也就是说有多少cpp文件include,就有多少相互独立的 static 变量。
然鹅这并不是我们期待的, 我们期待的是大家要公用一个变量。为了解决这个问题。首先想到的是规避static变量在CPP文件中分配内存。也就是像下边这么书写
static logger_iface **getLoggerAddr()
{
static logger_iface *activeLogger;
return &activeLogger;
}