c++中的静态结构和静态全局变量

static structure and static global variable in c++

本文关键字:静态 全局变量 结构 c++      更新时间:2023-10-16

有一个RPC框架,使用hessian作为默认的序列化。然后,一些客户端需要protobuf。为了与那些没有安装protobuf的人兼容,我们将所有protobuf支持放在一个文件中,并根据当前环境(是否有pb)有条件地编译它
框架有一系列的数据类型(Long, String, Map等),每一个都有一个序列化器,我们使用一个静态结构来注册这些函数,它看起来像:

/*file register.cc */

在protobuf支持文件中,我们做了类似的事情:

/* pb_support.cc */

两个文件在不同的目录中退出:
在gcc 4.1.2和Redhat5.6中,它工作得很好。在Ubuntu 13.04的gcc 4.8中,当protobuf在时,pb_object_install总是先执行,但是结果是零,这意味着pb注册的结果已经被清除,所以protobuf协议是无用的。
为什么呢?是否有替换来完成相同的函数?

全局命名空间中变量的初始化顺序是在单个翻译单元中声明。但是,翻译单元之间的初始化顺序没有指定。

这意味着如果你有两个源文件,你不能说哪个文件变量将首先被初始化。如果一个源文件中的变量依赖于另一个源文件中的变量首先被初始化,那么这当然会导致问题。