C++ 使用共享库中程序中的全局变量



我创建了一个可以加载不同共享库(problem1.so、problem2.so 等(的程序。在这个程序中,我有一个用作全局变量的 Config 对象。我想知道如何在我的程序和共享库之间共享全局变量。目前,我已经这样做了:

配置.hh

struct Config {
  Config();
  int test;
};
extern Config config;

配置.cpp

#include "Config.hh"
Config config;
Config::Config() : test(3) {} // set test to 3

问题1.hh//我的一个共享库的部分主类

#include "Config.hh"
class Problem {
  Problem();
};

问题 1.cpp//部分文件

#include "Problem.hh"
Problem::Problem() {
   std::cout << config.test << std::endl; // print 0 and not 3
} 

问题是 Problem 构造函数打印 0 而不是 3,就好像我的全局变量(在共享库之外完美工作(在共享库中重置一样。有人知道如何解决这个问题吗?

编辑:"问题"对象不是全局的

猜猜你也有Problem对象作为全局对象,并在与config不同的源文件中定义。全局对象的初始化经历两个阶段,即静态初始化和动态初始化。

根据 cpp 偏好(强调我的(:

静态初始化
...
2( 对于所有其他非局部静态变量和线程局部变量,零 进行初始化。在实践中,变量将 被零初始化放置在程序的.bss段中 映像,不占用磁盘上的空间,并且作系统清零 加载程序时。
...
动态初始化
...
2( 有序动态初始化,适用于所有其他 非局部变量:在单个翻译单元中,这些变量 按其定义在源中出现的确切顺序进行初始化 法典。不同转换中静态变量的初始化 单位是不确定的顺序。线程本地初始化 不同翻译单元中的变量是未排序的。

因此,在您的情况下,在调用 ConfigProblem 构造函数(相当于动态初始化(之前,静态初始化零初始化test初始化为0。在动态初始化阶段,如果config和全局Problem对象是在单独的cpp文件(翻译单元(中定义的,则无法知道首先调用谁的构造函数。如果在 config 之前首先调用 Problem 对象的构造函数,则在Problem构造函数中,您将看到由于静态初始化而0 test

相关内容

  • 没有找到相关文章

最新更新