Compilerwarnung C5248
Der Abschnitt "Abschnittsname" ist für die dynamische C++-Initialisierung reserviert. Variablen, die manuell in den Abschnitt eingefügt werden, können optimiert werden, und ihre Reihenfolge relativ zu den vom Compiler generierten dynamischen Initialisierern ist nicht angegeben.
Hinweise
Der Microsoft C++-Compiler verwendet reservierte Abschnittsnamen für die interne Implementierung von Features wie der dynamischen C++-Initialisierung. Wenn ihr Code eine Variable in einen reservierten Abschnitt einfügt, z .CRT$XCU
. B. , wird dies mit dem Compiler beeinträchtigt. Ihre Variable wird nicht als dynamischer C++-Initialisierer betrachtet. Außerdem wird die relative Initialisierungsreihenfolge im Vergleich zu vom Compiler generierten dynamischen Initialisierern nicht angegeben.
Um diesen Fehler zu beheben, erstellen Sie keinen Abschnitt, der den reservierten Namen verwendet, oder fügen Sie eine Variable im reservierten Abschnitt ein.
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 C5248 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;