Чтобы уточнить, я не говорю о многопоточной среде. Я часто сталкиваюсь с ситуацией, когда мне приходится выделять некоторые ресурсы в функции init (и, следовательно, освобождать ресурс в функции завершения), и где я бы хотел избежать двойного вызова. Мне было интересно, есть ли что-то вроде встроенного ключевого слова в C/C++, чтобы сделать его вызываемым один раз. Что-то более сложное, чем статической локальной переменной, которую я бы дублируется во всех моих функций инициализации, какЕсть ли способ сделать глобальную функцию/статическую функцию-член вызываться один раз?
static bool isInitialized = false;
if (!isInitialized) {
isInitialized = true;
//...
}
Или, может быть, это не так уж плохо, и я мог бы скрыть это за макро CALLABLE_ONCE.
Я открыт для любых решений из C/C++ 03/C++ 11/C++ 14.
EDIT:
Причина, почему я бы с помощью инициализации/прекратить схему на глобальном масштабе будет в основном из-за того, что я склонен создавать пространство имен для объектов, которые не должно быть экземплярами более чем один раз, и избегать использования синглтона, как рекомендуется на this post. Конечно, использование класса было бы проще, так как я просто использовал бы конструктор/деструктор, но как можно инициализировать (только один раз) этот вид сущностей (пространств имен)?
Есть ли что-то, препятствующее вам сделать это внутри конструктора/деструктора? – Telokis
Я не знаю ни одного объекта в C++, который предоставляет эту функциональность. В Windows вы можете воспользоваться возможностями [Одноразовая инициализация] (https://msdn.microsoft.com/en-us/library/ms686934.aspx). – IInspectable
@Ninetainedo Да, я ищу что-то, что работает в глобальной функции/статической функции-члене. Если бы я использовал конструктор/деструктор, это в основном означало бы использовать какой-то одноэлемент. У меня может быть флаг участника, который говорит, что если я инициализирован во всех случаях, но я искал ключевое слово или взломал, передав лямбду функции. – lordjohncena