gpt4 book ai didi

c++ - 有没有办法使全局函数/静态成员函数可调用一次?

转载 作者:搜寻专家 更新时间:2023-10-31 02:12:45 25 4
gpt4 key购买 nike

澄清一下,我不是在谈论多线程环境。我经常遇到这样一种情况,我必须在 init 函数中分配一些资源(并因此在终止函数中释放资源)并且我想避免调用它两次。我想知道 C/C++ 中是否有类似内置关键字的东西来使其可调用一次。比静态局部变量更复杂的东西,我会在我所有的初始化函数中复制它,比如

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

或者也许它并没有那么糟糕,我可以将其隐藏在宏 CALLABLE_ONCE 后面。

我对来自 C/C++03/C++11/C++14 的任何解决方案持开放态度。

编辑:

我之所以会在全局范围内使用 init/terminate 方案,主要是因为我倾向于为不应多次实例化的实体创建 namespace ,并避免像this post .当然,使用类会更容易,因为我会简单地使用构造函数/析构函数,但是如何初始化(仅一次)这种实体( namespace )?

最佳答案

std::call_once ,虽然它是为了与线程一起使用而不仅仅是一个线程应用程序,但它也可以被一个线程应用程序使用。

您可能会遇到的一个问题是,如果它抛出异常,那么它就不会被视为已初始化。你可以protect the initialization function不过,如果需要,可以使用 try/catch

此外,在您的情况下,您可能需要一个公共(public)静态函数和另一个私有(private)函数。公共(public)静态函数将执行 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 是线程安全的。

关于c++ - 有没有办法使全局函数/静态成员函数可调用一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42318736/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com