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;