Avertissement du compilateur C5248
la section « section-name » est réservée à l’initialisation dynamique C++. Les variables placées manuellement dans la section peuvent être optimisées et leur ordre relatif aux initialiseurs dynamiques générés par le compilateur n’est pas spécifié
Notes
Le compilateur Microsoft C++ utilise des noms de section réservés pour l’implémentation interne de fonctionnalités telles que l’initialisation dynamique C++. Si votre code insère une variable dans une section réservée, par .CRT$XCU
exemple, elle interfère avec le compilateur. Votre variable n’est pas considérée comme un initialiseur dynamique C++. En outre, son ordre d’initialisation relatif par rapport aux initialiseurs dynamiques générés par le compilateur n’est pas spécifié.
Pour résoudre cette erreur, ne créez pas de section qui utilise le nom réservé ou insérez une variable dans la section réservée.
Il n’existe aucun moyen conforme standard C++ d’initialiser des variables entre les unités de traduction, dans un ordre relatif spécifique avec les initialiseurs dynamiques générés par le compilateur. Les méthodes permettant de forcer l’initialisation avant ou après le compilateur générés par des initialiseurs dynamiques C++ sont spécifiques à l’implémentation. Pour plus d’informations sur les détails de l’implémentation spécifique à Microsoft, consultez l’initialisation CRT.
Avertissement du compilateur C5248 est nouveau dans Visual Studio 2019 version 16.11. Il est désactivé par défaut. Pour plus d’informations sur l’activation de cet avertissement, consultez Avertissements du compilateur désactivés par défaut.
Exemple
Le code qui tente d’émuler le comportement du compilateur C++ pour l’initialisation dynamique prend souvent la forme suivante :
void f();
typedef void (*type)();
#pragma section(".CRT$XCU", read)
__declspec(allocate(".CRT$XCU")) type i = f;
Ce code crée une section à l’aide d’un nom réservé. .CRT$XCU
Il empêche le compilateur de créer la section avec les propriétés attendues et peut ignorer d’autres initialisations. La variable i
placée dans la section est une variable régulière et n’est pas considérée comme un initialiseur par le compilateur. Le compilateur peut s’optimiser i
. L’ordre relatif lorsqu’il f
est appelé par rapport à d’autres initialiseurs dynamiques n’est pas spécifié.
Si l’ordre d’initialisation n’est pas important, vous pouvez utiliser ce modèle pour initialiser dynamiquement une variable au démarrage :
void f();
struct init_helper {
init_helper() { f(); }
};
init_helper i;