有没有一种方法可以使全局函数/静态成员函数一次可呼出

Is there a way to make global function/static member function callable once?

本文关键字:函数 一次 静态成员 全局 一种 方法 可以使 有没有      更新时间:2023-10-16

要澄清,我不是在谈论多线程环境。我经常遇到一种情况,我必须在初始化功能中分配一些资源(因此在终止功能中释放资源),并且我想避免将其调用两次。我想知道是否有C/C 中的内置关键字可以使其可召唤一次。比静态局部变量更复杂的东西,我会在我的所有初始化功能中重复使用,例如

static bool isInitialized = false; 
if (!isInitialized) {
  isInitialized =   true;
//...
} 

或也许还不错,我可以将其隐藏在宏Callable_once后面。

我对C/C 03/C 11/C 14的任何解决方案开放。

编辑:

我之所以在全球范围上使用初始/终止方案的原因主要是由于我倾向于为不应该一次实例化的实体创建名称空间,并避免使用Singnleton在上面进行的鼓励。这个帖子。当然,使用类会更容易,因为我只需使用构造函数/驱动器,但是如何初始化(仅一次)此类实体(名称空间)?

std::call_once,尽管显示为与线程一起使用,而不仅仅是一个线程应用程序,但也可以由一个线程应用程序使用。

您可能会遇到的一个问题是,如果它抛出,则不被视为初始化。如果需要,您可以使用try/catch保护初始化功能。

在您的情况下,您可能需要一个公共静态功能和另一个私有功能。公共静态功能将执行std::call_once。这样的东西:

class my_class
{
public:
  static void init()
  {
     std::call_once(m_initialized, private_init);
  }
private:
  static void private_init()
  {
     ... // init here
  }
  static std::once_flag   m_initialized;
};
如您所见,它看起来与您的功能完全相同,除了隐藏了if()和标志开关。您也可以将m_initialized标志保留在第一个函数中作为静态变量。

一个区别是std::call_once是线程安全的。