Avviso del compilatore C5247
la sezione 'section-name' è riservata per l'inizializzazione dinamica C++. La creazione manuale della sezione interferisce con l'inizializzazione dinamica C++ e può causare un comportamento non definito
Osservazioni:
Il compilatore Microsoft C++ usa nomi di sezione riservati per l'implementazione interna di funzionalità come l'inizializzazione dinamica C++. Se il codice crea una sezione con lo stesso nome di una sezione riservata, ad esempio .CRT$XCU
, interferisce con il compilatore. Può impedire l'inizializzazione dinamica e causare un comportamento non definito.
Per risolvere questo errore, non creare una sezione che usa il nome riservato.
Non esiste un modo conforme allo standard C++ per inizializzare le variabili tra le unità di conversione, in un ordine relativo specifico con inizializzatori dinamici generati dal compilatore. I modi per forzare l'inizializzazione prima o dopo che i inizializzatori dinamici C++ generati dal compilatore sono specifici dell'implementazione. Per altre informazioni sui dettagli di implementazione specifici di Microsoft, vedere Inizializzazione CRT.
Avviso del compilatore C5247 è una novità di Visual Studio 2019 versione 16.11. È disattivato per impostazione predefinita. Per altre informazioni su come abilitare questo avviso, vedere Avvisi del compilatore disattivati per impostazione predefinita.
Esempio
Il codice che tenta di emulare il comportamento del compilatore C++ per l'inizializzazione dinamica assume spesso questo formato:
void f();
typedef void (*type)();
#pragma section(".CRT$XCU", read)
__declspec(allocate(".CRT$XCU")) type i = f;
Questo codice crea una sezione usando un nome riservato, .CRT$XCU
. Impedisce al compilatore di creare la sezione con le proprietà previste e di ignorare altre inizializzazioni. La variabile i
inserita nella sezione è una variabile regolare e non è considerata un inizializzatore dal compilatore. Il compilatore potrebbe essere ottimizzato i
. L'ordine relativo quando f
viene chiamato rispetto ad altri inizializzatori dinamici non è specificato.
Se l'ordine di inizializzazione non è importante, è possibile usare questo modello per inizializzare dinamicamente una variabile all'avvio:
void f();
struct init_helper {
init_helper() { f(); }
};
init_helper i;