Advertencia del compilador C5248
La sección "section-name" está reservada para la inicialización dinámica de C++. Las variables que se colocan manualmente en la sección se pueden optimizar y su orden en relación con los inicializadores dinámicos generados por el compilador no está especificado
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 inserta una variable en una sección reservada, como .CRT$XCU
, interfiere con el compilador. La variable no se considera un inicializador dinámico de C++. Además, no se especifica el orden de inicialización relativo en comparación con los inicializadores dinámicos generados por el compilador.
Para resolver este error, no cree una sección que use el nombre reservado ni inserte una variable en la sección reservada.
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 C5248 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;