如何在全局变量的构造函数之前运行函数
How to run a function before constructors from global variables
我有一个带有全局变量的 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++。
此方法会产生一些运行时开销。从一开始就担心开销可能还为时过早,但知道开销确实存在可能会很有用。(基本上,每次调用函数时,程序都必须检查布尔标志以确定变量是否已初始化。
相关文章:
- 无法获取菜单选择以运行函数.C++
- 为什么std::async使用同一个线程运行函数
- MINGW - 正确运行函数所需的 cdecl
- 如何在 C 中使用空的 main() 方法运行函数?
- 运行函数作为 constexpr 和不作为 constexpr
- 如何在全局变量的构造函数之前运行函数
- 在 Cap'n Proto RPC 服务器中定期运行函数
- 为什么当我在 c++ 中运行函数时,我的代码显示数字 53
- CLang:在 std::thread 中运行函数会导致结构创建BAD_ACCESS
- 如何使用 TBB 在单个线程中运行函数
- 我在运行函数 GetVolumeInformation() 时得到非常随机的结果
- 如何使用 boost::asio io_service 运行函数异步
- Qt - 在其他线程上运行函数
- 在一组模板化对象上运行函数
- pybind11:属性错误:尝试从 py 文件运行函数时,模块'XXX'没有属性'YYY'
- 添加按钮以通知运行函数的通知
- 如何在程序后台运行函数(特别是自动保存函数)?QT / C++
- Qt - 在单独的线程中运行函数
- 如何在单独的线程上运行函数(如果线程可用)
- 如何发出编译和运行C++函数的 LLVM IR