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;

Confira também

Inicialização de CRT