是否可以在 main() 之外调用函数?

Is it possible to call a function outside of main()?

我想我的问题很愚蠢,但是:

在我的 C++ 代码中,我使用了一些遗留的 C 库 (XLib)。为了使用这个库,必须首先打开到 X 服务器的连接:

::Display* const display = ::XOpenDisplay(nullptr);

display 结构广泛用于绝大多数 XLib 函数,包括用于分配和释放内存和系统资源(如字体、颜色映射等)的函数。在我的代码中,我使用对象的构造函数和析构函数通过调用这些函数来分配和释放资源。问题是:

int main()
{
    ::Display* const display = ::XOpenDisplay(nullptr);
    // ...
    Object1 object1(display, ...); // uses display inside the destructor
    Object2 object2(display, ...); // uses display inside the destructor
    Object3 object3(display, ...); // uses display inside the destructor
    // ...
    ::XCloseDisplay(display); // invalidates the display structure
    return 0;
}

此示例导致分段错误,因为 display 结构在调用任何使用它的析构函数之前已被 XCloseDisplay() 无效。为了避免这个问题,我可以将 XCloseDisplay() 之前的所有代码都包含在大括号中以限制对象的范围,但它会使代码向右移动,看起来很难看。

有什么办法可以在 main() 之后调用 XCloseDisplay() 吗?

可以,但没必要。

相反,将它包装在一个 class 中,在析构函数中将其关闭,就像您对其他对象所做的那样。

析构函数以相反的顺序调用,这意味着如果您先创建显示,它就会最后死掉。


您在 main 之后调用它的方式类似地来自全局或 function-local static 对象的析构函数。 function-local static 优于全局变量,因为它避免了 static init order fiasco.

使用 attribute 和 gcc 也可以工作

void __attribute__((constructor)) calledFirst();
void __attribute__((destructor)) calledLast();
  
void main()
{
    printf("\nI am in main");
}
  
// This function is assigned to execute before
// main using __attribute__((constructor))
void calledFirst()
{
    printf("\nI am called first");
}
  
// This function is assigned to execute after
// main using __attribute__((destructor))
void calledLast()
{
    printf("\nI am called last");
}

测试:https://godbolt.org/z/vPhf36cbe