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

标签 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 中,它运行良好。在gcc 4.8和Ubuntu 13.04中,当protobuf在的时候,pb_object_install总是先执行,但是结果为0,也就是说pb注册的结果已经被抹掉了,所以protobuf协议(protocol)是没有用的。
这是为什么?是否有任何替代品可以完成相同的功能?

最佳答案

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

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

关于c++ - C++中的静态结构和静态全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24906450/

相关文章:

c++ - 内置类型的 std::map 默认值

c - 读取全志H3 ARM处理器的寄存器

C++符号分析: how to determine which static initialization is performed?

c++ - 魔术静力学保证右侧只执行一次吗?

c++ - 在 C++ 结构中处理未知类型的最佳方法是什么?

c++ - 检查是否在数组c++中找到元素

c - 在 C 中切换 unsigned int 的给定范围的位

使用 C 使用头文件中定义的结构时出现编译错误

java - 在没有静态嵌套类的情况下按需初始化多个静态变量?

c++ - 我想知道您能否告诉我 imread 和 cvLoadImageM 之间的区别