Wenn ich habe folgende A.h
Datei (Header only):Müssen statische Inline-Variablen vor main initialisiert werden?
#pragma once
struct A{
static inline struct Initializer{
Initializer(){
std::cout << "init A" << std::endl;
}
} initializer;
};
es genug, um #include "A.h"
ist (von einem anderen Header, der von main.cpp enthalten sein wird), so Initializer::Initializer()
vor main()
genannt werden?
Ich lese, dass Standard erfordert, statische Variablen mit dynamischer Initialisierung erst vor seiner Verwendung zu initialisieren.
Es ist die Implementierung definiert, ob die dynamische Initialisierung (8.5, 9.4, 12.1, 12.6.1) eines Objekts von Namespacebereich ist vor der ersten Anweisung des Haupt getan. Wenn die Initialisierung zu einem Zeitpunkt nach der ersten Hauptaussage auf zurückgestellt wird, muss sie vor der ersten Verwendung einer Funktion oder eines Objekts erfolgen, die in der gleichen Übersetzungseinheit wie das zu initialisierende Objekt definiert sind.
Wird #include
als "Verwendung" betrachtet?
Lokale statische Variablen (interne Funktionen) werden initialisiert, wenn die Funktion zum ersten Mal aufgerufen wird. Alle anderen statischen Variablen werden initialisiert, bevor 'main' aufgerufen wird. –
'#include" file "' bedeutet nur "füge den Inhalt von 'file' hier ein". Es verhält sich genau so, als wenn Sie stattdessen copy and paste verwendet hätten (aber beim Berichten von Diagnosen die Zeilennummern anpassen). – molbdnilo
@Someprogrammerdude Ich denke nicht, dass das wahr ist ... http://en.cppreference.com/w/cpp/language/initialization siehe "Deferred dynamische Initialisierung" – tower120