Avertissement du compilateur C5247
la section « section-name » est réservée à l’initialisation dynamique C++. La création manuelle de la section interfère avec l’initialisation dynamique C++ et peut entraîner un comportement non défini
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 crée une section portant le même nom qu’une section réservée, par .CRT$XCU
exemple, elle interfère avec le compilateur. Il peut empêcher l’initialisation dynamique et provoquer un comportement non défini.
Pour résoudre cette erreur, ne créez pas de section qui utilise le nom réservé.
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 C5247 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;