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

时间:2014-07-23 09:13:51

标签: c++ c static-initialization

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

/*file register.cc */

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

/* pb_support.cc */

两个文件退出不同的目录:
在使用Redhat5.6的gcc 4.1.2中,它运行良好。在带有Ubuntu 13.04的gcc 4.8中,当protobuf进入时,pb_object_install总是首先执行,但结果为零,这意味着pb注册的结果已被清除,因此protobuf协议无用。
这是为什么?是否有任何替代来完成同样的功能?

1 个答案:

答案 0 :(得分:3)

全局命名空间中变量的初始化按单个translation unit 中声明的顺序排列。但是,未指定translation units之间的初始化顺序。

这意味着如果您有两个源文件,则无法说明将首先初始化哪些文件变量。如果一个源文件中的变量依赖于另一个首先初始化的源文件中的变量,那么这当然会引起问题。