如何在全局变量的构造函数之前运行函数

How to run a function before constructors from global variables

本文关键字:运行 函数 构造函数 全局变量      更新时间:2023-10-16

我有一个带有全局变量的 c++ ncurses 程序,其中包含 WINDOW*。

问题是我不想在这个构造函数中从 ncurses 初始化每个例程。我确实想先于其他一切来初始化我的诅咒。

这是我的构造函数:

37 Window_c::Window_c()
38 {
41     // Create the window and check for errors
42     if ((m_Window = newwin(0, 0, 0, 0)) == NULL) {
43     ┊   fprintf(stderr, "[ERROR] - Unable to open the Windown");
44     ┊   exit(EXIT_FAILURE);
45     }
46 }

这是我所谓的主要:

33 __attribute__((constructor)) void CursesBeginRoutine(void)   
34 {    
35     initscr();   
36     cbreak();        
37     noecho();            
38     keypad(stdscr, TRUE);   
39 }
40 
41 int main(int argc __attribute__((unused)), char const *const argv[] __attribute__((unu|
42 {
43     MainLoop();
44     return 0;
45 }
46                                                                                        
47 __attribute__((destructor)) void CursesEndRoutine(void)
48 {
49     endwin();
50 }

可悲的是,它不起作用,因为 gcc 的属性是在构造函数之后调用的,这是逻辑。

我该怎么做这些事情?

好的,所以...这只是我的错,因为我的构造函数属性不在同一个文件中。 原因,他们之前打电话,可能是因为我的编译/链接顺序?我真的不知道为什么,但是,属性确实在全局变量的构造函数之前被调用

对不起一切,谢谢

延迟初始化的一种方法是将变量包装在函数中。这个想法是,在调用函数之前不会进行初始化,但该函数仍然可以存在于全局范围内。

如果存在相互依赖关系,则可能需要解决全局变量的一些复杂性。这个问题没有包含所有的细节(可能不应该(,但将原则应用于单个全局可能足以让你开始。假设您的全局称为Window。您的代码将调用我们现在将调用GetWindow()调用的函数,而不是直接访问Window。(使用适合您风格的任何命名方案。

Window_c & GetWindow()
{
static Window_c Window;
return Window;
}

这个想法是,在调用此函数之前不会构造Window。这使您有时间先完成其他初始化。请注意,如果您的析构函数订单变得相关,则可能会出现问题。关于这个主题可以(并且已经(写了很多。进一步阅读的关键搜索短语是"静态初始化顺序惨败"。一个参考是ISO C++。

此方法会产生一些运行时开销。从一开始就担心开销可能还为时过早,但知道开销确实存在可能会很有用。(基本上,每次调用函数时,程序都必须检查布尔标志以确定变量是否已初始化。