Um zu verdeutlichen, spreche ich nicht über Multi-Thread-Umgebung. Ich stoße oft auf eine Situation, in der ich einige Ressourcen in einer Init-Funktion zuweisen muss (und folglich die Ressource in einer Terminierungsfunktion freigebe) und wo ich es vermeiden möchte, sie zweimal aufzurufen. Ich habe mich gefragt, ob es in C/C++ etwas wie ein eingebautes Schlüsselwort gab, um es einmal aufrufbar zu machen. Etwas anspruchsvoller ist als ein statischer lokaler Variable, die ich über alle meine init Funktionen dupliziert haben würde wieGibt es eine Möglichkeit, die Funktion global/static member einmal aufrufbar zu machen?
static bool isInitialized = false;
if (!isInitialized) {
isInitialized = true;
//...
}
Oder vielleicht ist es nicht so schlimm, und ich konnte dies hinter einem Makro CALLABLE_ONCE verstecken.
Ich bin offen für alle Lösungen von C/C++ 03/C++ 11/C++ 14.
EDIT:
Der Grund, warum ich das init/beenden Schema auf dem globalen Bereich aufgrund der Tatsache, wäre in erster Linie verwenden, dass ich Namespaces für Entitäten erstellen neigen, die nicht mehr instanziiert werden soll als einmal und vermeide die Verwendung von Singleton, wie unter this post empfohlen. Natürlich wäre die Verwendung einer Klasse einfacher, da ich einfach den Konstruktor/Destruktor verwenden würde, aber wie kann man diese Art von Entitäten (Namespaces) initialisieren (nur einmal)?
Gibt es etwas, das Sie davon abhält, dies im Konstruktor/Destruktor zu tun? – Telokis
Ich kenne keine Einrichtung in C++, die diese Funktionalität verfügbar macht. Unter Windows können Sie die Funktionen [Einmalige Initialisierung] (https://msdn.microsoft.com/de-de/library/ms686934.aspx) nutzen. – IInspectable
@Ninetainedo Ja, ich suche nach etwas, das in einer globalen Funktion/statischen Elementfunktion funktioniert. Wenn ich einen Konstruktor/Destruktor verwenden würde, würde das bedeuten, dass ich einen Singleton irgendeiner Art verwenden muss. Ich könnte ein Mitglied Flag haben, das sagt, wenn ich in allen Fällen initialisiert werde, aber ich suchte nach einem Schlüsselwort oder einem Hack, indem ich ein Lambda zu einer Funktion übertrug. – lordjohncena