Compilerwarnung C5248

Abschnitt "Abschnittsname" ist für die dynamische C++-Initialisierung reserviert. Variablen, die manuell in den Abschnitt eingegeben werden, können optimiert werden, und ihre Reihenfolge relativ zu 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 Initialisierung von C++. Wenn Ihr Code eine Variable in einen reservierten Abschnitt einfügung, .CRT$XCUz. B. , wird der Compiler beeinträchtigt. Ihre Variable wird nicht als dynamischer C++-Initialisierer betrachtet. Außerdem wird die relative Initialisierungs reihenfolge 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 in den reservierten Abschnitt ein.

Es gibt keine C++-Standardkonformität, um Variablen über Übersetzungseinheiten hinweg in einer bestimmten relativen Reihenfolge mit vom Compiler generierten dynamischen Initialisierern zu initialisieren. Möglichkeiten, die Initialisierung vor oder nach dem Vom Compiler generierten dynamischen C++-Initialisierern zu erzwingen, sind implementierungsspezifisch. Weitere Informationen zu Microsoft-spezifischen Implementierungsdetails finden Sie unter CRT-Initialisierung.

Compilerwarnung C5248 ist neu in Visual Studio 2019 Version 16.11. Sie ist standardmäßig deaktiviert. Weitere Informationen zum Aktivieren dieser Warnung finden Sie unter Standardmäßig deaktivierte Compilerwarnungen.

Beispiel

Code, der versucht, das C++-Compilerverhalten für die dynamische Initialisierung zu emulieren, hat häufig die folgenden Formen:

void f();
typedef void (*type)();

#pragma section(".CRT$XCU", read)
__declspec(allocate(".CRT$XCU")) type i = f;

Dieser Code erstellt einen Abschnitt mit dem reservierten Namen .CRT$XCU. Er verhindert, dass der Compiler den Abschnitt mit den erwarteten Eigenschaften erstellt, und überspringt möglicherweise andere Initialisierungen. Die im i Abschnitt platzierte Variable ist eine reguläre Variable und wird vom Compiler nicht als Initialisierer betrachtet. Der Compiler kann möglicherweise wegoptimieren i . Die relative Reihenfolge beim Aufruf f von im Vergleich zu anderen dynamischen Initialisierern ist nicht angegeben.

Wenn die Initialisierungs reihenfolge 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;

Siehe auch

CRT-Initialisierung