0

据我所知,我有一些在main()调用之前创建的全局变量(类)。我需要一些技术来从我的代码的任何部分将数据添加到全局或作为该类的成员的列表中,并且必须在链接器之前填充它。在全局创建的类中使用它。是否可以?我没有找到任何类似的解决方案甚至问题,因此将不胜感激。

详细示例:

我有一个单例类,它有一个在构造函数中填充的变量。所有其他类在运行时使用类中的数据,有人早有人晚。单例类是在 main 函数的开头创建的。我在不同的项目中使用单例,除了应该显示该模块要求的特殊标志外,它对所有项目和模块具有大部分通用的数据。如果单例抛出异常程序退出并且我们在执行的第一步就知道它,因为单例在 main 的第一行创建。所以单例对所有项目都有很多通用数据,但我需要添加标志来指向单例,每个模块都需要哪些数据。我已经为 main 创建了模板,因此对于每个项目我都有相同的 main,只需简单地定义 PROJECT_NAME 稍后我添加 .

这个解释看起来并不完美,如果不明白不要犹豫,我会更刻意地组织它。

编辑:

我仍在互联网上寻找解决方案,发现 constexpr 看起来像我需要的,但目前并非所有编译器都支持它,是否有一些解决方法?

4

2 回答 2

1

第一步是不使用全局变量,而是在全局函数中使用静态变量。第一次调用函数时,变量将被初始化,然后让函数返回对变量的引用。

my_class& instnace() {
   static my_class i;
   return i;
}

列表示例:

std::list<my_class>& global_list() { 
   static std::list<my_class> m; return m;
}


static int x = []()->int{ global_list().push_back(my_class); return 0;}();
于 2012-07-29T15:00:01.803 回答
0

如果你想从不同的模块中完成你想要的,其中一种方法是在你的 dll 加载时完成某种回调函数。

一个窗口是DLLMain

动态链接库 (DLL) 的可选入口点。当系统启动或终止进程或线程时,它会使用进程的第一个线程为每个加载的 DLL 调用入口点函数。当使用 LoadLibrary 和 FreeLibrary 函数加载或卸载 DLL 时,系统还会调用 DLL 的入口点函数。

在使用 gcc 的其他平台上,您可以通过 [属性构造函数]

constructor 构造函数属性使函数在执行进入main()之前被自动调用。类似地,析构函数属性使函数在 main() 完成或 exit() 被调用后自动调用。具有这些属性的函数对于初始化将在程序执行期间隐式使用的数据很有用。这些属性目前还没有为 Objective-C 实现。

警告

用这种方法很容易射中自己的脚。至少在那些你不能在dll 入口点做很多事情的窗口上。请阅读您的编译器/操作系统文档以了解限制是什么。

于 2012-07-29T15:27:33.003 回答