2010-10-08 110 views
1

这是我长时间咆哮后的一个新问题。这里的问题是,我的主应用程序中有一个全局的vector<Base*> vObjs,我在每个链接到应用程序的static lib中获得了Derived obj s。如果我指定vObjs的init_priority为101,并且每个obj在静态库中的含义为...... 1000,是否保证vObjs将在静态库中获得在obj之前调用的构造函数?谢谢你的帮助。静态库中变量的init_priority属性

回答

2

让我回应你可能想要重新考虑使用全局变量的其他答案。然而,一个可能的(我肯定仍然存在漏洞)至少可以消除对init优先级的需求。

而不是使用全球vector,您创建一个函数返回对静态本地的引用。 C++规则确保函数static local始终在第一次使用时最初被初始化,所以您不必担心vector未被初始化。

vector<LibInfo*>& get_gvLibInfo() 
{ 
    vector<LibInfo*> gvLibInfo; 
    return gvLibInfo; 
} 

您的注册看起来像:

vector<LibInfo*>& get_gvLibInfo(); 

void reglib() 
{ 
    get_gvLibInfo().push_back(this); 
} 
+0

谢谢。我打算使用__attribute __((init_priority())),但这种方法看起来好一些。 – nakiya 2010-10-08 15:46:11

0

如果您使用的是GNU C++,它们似乎可以保证初始化的顺序(click here)。但是我应该注意,如果你真的依赖初始化的顺序,那么你的设计是脆弱的。当你不关心订单时,更好地寻找替代品。 HTH

+2

实际上,该值越高,传递给'init_priority',低优先级有。 – nakiya 2010-10-08 10:18:19

+0

@nakiya:我的坏,编辑 – 2010-10-08 10:23:11

1

Global Variables已被considered harmful替换为nearly forty years,但人们仍然坚持使用它们。为什么?

reconsider your design,因为它很脆弱,并会在未来很多年内提供a maintenance headache

+0

http://stackoverflow.com/questions/3880380/static-lib-loading-related-problem-please-help 这就是为什么我需要一个全局变量。 – nakiya 2010-10-08 10:30:14

+1

更正,这就是为什么*你认为*你需要一个全局变量。 – Johnsyweb 2010-10-08 13:27:49