Compartilhar via


Aviso do compilador C5247

A seção 'section-name' é reservada para inicialização dinâmica C++. A criação manual da seção interferirá na inicialização dinâmica do C++ e pode levar a um comportamento indefinido

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 seu código criar uma seção com o mesmo nome de uma seção reservada, tal como .CRT$XCU, ela interferirá no compilador. Ela pode impedir outra inicialização dinâmica e causar um comportamento indefinido.

Para resolver esse erro, não crie uma seção que use o nome reservado.

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 C5247 é 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 do CRT