【发布时间】:2010-07-30 13:36:48
【问题描述】:
我在 GCC 中使用 __attribute__((init_priority(X))),如下所示:
Type1 __attribute__ ((init_priority (101))) name1 = value1;
Type2 __attribute__ ((init_priority (102))) name2 = value2;
在不同的源文件中。比方说 file1.cpp 和 file2.cpp。 如果我在同一个库中使用它,它会按预期工作,name1 在 name2 之前初始化,但如果我在不同的库中使用它,则初始化顺序不是预期的。我在 gcc 文档上读到,这应该可以在我期望的不同库中工作,以定义初始化的顺序。我使用它的方式有问题吗?你有同样的问题吗?
PS:重构不是解决这个问题的办法,因为我必须从 Visual Studio 移植一个非常大的项目。
【问题讨论】:
-
感谢 C++ 让这个噩梦彻底崩溃。这只是这种糟糕语言的众多问题之一。
-
这里的问题不是语言,而是架构。它是一种很棒的编程语言,但并非所有开发人员都知道如何使用它。
-
程序的入口点无法以任何标准方式确定,这怎么不是语言的错?像程序起点这样基本的东西应该可以用任何体面的语言轻松识别。
-
@Dan 该语言的入口点实际上是
main,为了避免这些初始化问题,您所要做的就是避免以翻译单元之间交互的方式使用全局/静态数据。如果您正在创建足够多的全局/静态数据而遇到问题,那么您几乎肯定应该重新考虑您的设计。 -
如果你移植这段代码,你怎么知道它在VS中总是以正确的顺序工作?如果您升级编译器版本并更改顺序怎么办?我认为实际上重构将使两个端口都变得更好,并且如果按步骤完成应该是可管理的。
标签: c++ gcc static initialization