Compilerwarnung C5247
Der Abschnitt „section-name“ ist für die dynamische C++-Initialisierung reserviert. Das manuelle Erstellen des Abschnitts beeinträchtigt die dynamische C++-Initialisierung und führt möglicherweise zu einem nicht definierten Verhalten.
Hinweise
Der Microsoft C++-Compiler verwendet reservierte Abschnittsnamen für die interne Implementierung von Features wie der dynamischen C++-Initialisierung. Wenn Ihr Code einen Abschnitt mit demselben Namen wie einen reservierten Abschnitt erstellt, z .CRT$XCU
. B. , stört er den Compiler. Möglicherweise verhindern Sie andere dynamische Initialisierungen und führen zu nicht definierten Verhaltensweisen.
Um diesen Fehler zu beheben, erstellen Sie keinen Abschnitt, der den reservierten Namen verwendet.
Es gibt keine C++-Standardkonformität, um Variablen in einer bestimmten relativen Reihenfolge mit vom Compiler generierten dynamischen Initialisierern zu initialisieren. Methoden zum Erzwingen der Initialisierung vor oder nach dem vom Compiler generierten dynamischen C++-Initialisierern sind implementierungsspezifisch. Weitere Informationen zu microsoftspezifischen Implementierungsdetails finden Sie unter CRT-Initialisierung.
Compilerwarnung C5247 ist neu in Visual Studio 2019, Version 16.11. Die Option ist standardmäßig deaktiviert. Weitere Informationen zum Aktivieren dieser Warnung finden Sie unter Compilerwarnungen, die standardmäßig deaktiviert sind.
Beispiel
Code, der versucht, das C++-Compilerverhalten für die dynamische Initialisierung zu emulieren, verwendet häufig diese Form:
void f();
typedef void (*type)();
#pragma section(".CRT$XCU", read)
__declspec(allocate(".CRT$XCU")) type i = f;
Dieser Code erstellt einen Abschnitt unter Verwendung eines reservierten Namens. .CRT$XCU
Er verhindert, dass der Compiler den Abschnitt mit den erwarteten Eigenschaften erstellt, und er kann andere Initialisierungen überspringen. Die im Abschnitt platzierte Variable i
ist eine normale Variable und wird vom Compiler nicht als Initialisierer betrachtet. Der Compiler kann wegoptimiert i
werden. Die relative Reihenfolge, wenn f
im Vergleich zu anderen dynamischen Initialisierern aufgerufen wird, ist nicht angegeben.
Wenn die Initialisierungsreihenfolge nicht wichtig ist, können Sie dieses Muster verwenden, um eine Variable beim Start dynamisch zu initialisieren:
void f();
struct init_helper {
init_helper() { f(); }
};
init_helper i;