Aviso do compilador C5248
A seção 'section-name' é reservada para inicialização dinâmica C++. As variáveis colocadas manualmente na seção podem ser otimizadas e sua ordem em relação aos inicializadores dinâmicos gerados pelo compilador não é especificada
Comentários
O compilador do Microsoft C++ usa nomes de seção reservados para a implementação interna de recursos como a inicialização dinâmica C++. Se o código inserir uma variável em uma seção reservada, por exemplo .CRT$XCU
, ela interferirá no compilador. Sua variável não é considerada um inicializador dinâmico C++. Além disso, a ordem de inicialização relativa em comparação com inicializadores dinâmicos gerados pelo compilador não é especificada.
Para resolver esse erro, não crie uma seção que use o nome reservado, ou insira uma variável na seção reservada.
Não há nenhuma maneira padrão em C++ para inicializar variáveis entre unidades de tradução em uma ordem relativa específica com inicializadores dinâmicos gerados pelo compilador. As maneiras de forçar a inicialização antes ou depois de inicializadores dinâmicos C++ gerados pelo compilador são específicas da implementação. Para obter mais informações sobre detalhes de implementação específicos da Microsoft, consulte a inicialização do CRT.
O aviso do compilador C5248 é novo no Visual Studio 2019 versão 16.11. Ele está desativado por padrão. Para obter mais informações sobre como habilitar esse aviso, confira Avisos do compilador desativados por padrão.
Exemplo
O código que tenta emular o comportamento do compilador C++ para inicialização dinâmica geralmente usa esse formulário:
void f();
typedef void (*type)();
#pragma section(".CRT$XCU", read)
__declspec(allocate(".CRT$XCU")) type i = f;
Esse código cria uma seção usando um nome reservado, .CRT$XCU
. Ele impede que o compilador crie a seção com as propriedades esperadas, e pode ignorar outras inicializações. A variável i
colocada na seção é uma variável regular, e não é considerada um inicializador pelo compilador. O compilador pode otimizar a remoção de i
. A ordem relativa quando f
é chamado em comparação com outros inicializadores dinâmicos não é especificada.
Se a ordem de inicialização não for importante, você poderá usar esse padrão para inicializar dinamicamente uma variável na inicialização:
void f();
struct init_helper {
init_helper() { f(); }
};
init_helper i;