Advertencia del compilador C5247
La sección "section-name" está reservada para la inicialización dinámica de C++. La creación manual de la sección interferirá con la inicialización dinámica de C++ y puede provocar un comportamiento no definido
Comentarios
El compilador de Microsoft C++ usa nombres de sección reservados para la implementación interna de características como la inicialización dinámica de C++. Si el código crea una sección con el mismo nombre que el de una sección reservada, como .CRT$XCU
, interfiere con el compilador. Puede impedir que haya otras inicializaciones dinámicas y provocar un comportamiento no definido.
Para resolver este error, no cree una sección que use el nombre reservado.
No existe ninguna manera compatible con el estándar de C++ de inicializar las variables entre unidades de traducción, en un orden relativo específico con inicializadores dinámicos generados por el compilador. Las maneras de forzar la inicialización antes o después de los inicializadores dinámicos de C++ generados por el compilador son específicas de la implementación. Para más información sobre los detalles de implementación específicos de Microsoft, consulte Inicialización de CRT.
La advertencia del compilador C5247 es nueva en la versión 16.11 de Visual Studio 2019. Está desactivada de manera predeterminada. Para obtener más información sobre cómo habilitar esta advertencia, consulte Advertencias del compilador desactivadas de forma predeterminada.
Ejemplo
El código que intenta emular el comportamiento del compilador de C++ para la inicialización dinámica suele tener este formato:
void f();
typedef void (*type)();
#pragma section(".CRT$XCU", read)
__declspec(allocate(".CRT$XCU")) type i = f;
Este código crea una sección con un nombre reservado, .CRT$XCU
. Impide que el compilador cree la sección con las propiedades esperadas y puede omitir otras inicializaciones. La variable i
que se ha puesto en la sección es una variable normal y el compilador no la considera un inicializador. El compilador puede optimizar i
. No se especifica el orden relativo cuando se llama a f
en comparación con otros inicializadores dinámicos.
Si el orden de inicialización no es importante, puede usar este patrón para inicializar dinámicamente una variable en el inicio:
void f();
struct init_helper {
init_helper() { f(); }
};
init_helper i;