Estado global en CRT
Algunas funciones del entorno de ejecución de C universal (UCRT) usan el estado global. Por ejemplo, establece la configuración regional para todo el programa, lo que afecta a los separadores de dígitos, la página de códigos de setlocale() texto, y así sucesivamente.
El estado global del UCRT no se comparte entre las aplicaciones y el sistema operativo. Por ejemplo, si la aplicación llama a , no afectará a la configuración regional de ningún componente del sistema operativo que use el tiempo de ejecución de C ni al setlocale() contrario.
Versiones específicas del sistema operativo de las funciones de CRT
En el UCRT, las funciones que interactúan con el estado global tienen una función "gemela", con el prefijo _o_ . Por ejemplo:
setlocale()afecta al estado global específico de la aplicación._o_setlocale()afecta al estado global compartido por todos los componentes del sistema operativo, pero no a las aplicaciones.
La única diferencia entre estas funciones "gemelas" es que cuando leen y escriben el estado global de CRT, las versiones específicas del sistema operativo (es decir, las versiones que comienzan por ) usan la copia del sistema operativo del estado global en lugar de la copia del estado global de la _o_ aplicación.
Las versiones específicas del sistema operativo de estas funciones están en ucrt.osmode.lib . Por ejemplo, la versión específica del sistema operativo de setlocale() es _o_setlocale()
Hay dos maneras de aislar el estado de CRT del componente del estado de CRT de una aplicación:
- Vincule estáticamente el componente mediante las opciones del
/MTcompilador (versión) o/MTd(depuración). Para obtener más información, vea /MD, /MT, /LD. La vinculación estática puede aumentar considerablemente el tamaño binario. - A partir de Windows a partir de Windows 10 versión 2004, vincule dinámicamente a CRT, pero llame a las exportaciones en modo so (las funciones que comienzan por o). Para llamar a las exportaciones en modo del sistema operativo, vincule estáticamente como antes, pero o bien ignore el UCRT estático mediante la opción del vinculador
/NODEFAULTLIB:libucrt.lib(versión) o/NODEFAULTLIB:libucrtd.lib(depurar). Y agregueucrt.osmode.liba la entrada del vinculador. Consulte /NODEFAULTLIB (Omitir bibliotecas) para obtener más información.
Nota
En el código fuente, escriba setlocale() , no _o_setlocale() . Al vincular con , el vinculador sustituirá automáticamente la versión específica del sistema ucrt.osmode.lib operativo de la función. Es decir, setlocale() se sustituirá por _o_setlocale() .
La vinculación ucrt.osmode.lib con deshabilita algunas llamadas UCRT que solo están disponibles en modo de aplicación. Si intenta llamar a estos, se producirá un error de vínculo.
Estado global afectado por la separación entre aplicaciones y sos
El estado global afectado por la separación de la aplicación y el estado del sistema operativo incluye:
- Datos de configuración regional
- Controladores de señal establecidos por señal
- Rutinas de terminación establecidas por terminate
- errno y _doserrno
- Estado de generación de números aleatorios usado por randy srand
- Funciones que devuelven un búfer que el usuario no necesita liberar: strtok, wcstok, _mbstokTmpnam, _wtmpnamasctime, _wasctimegmtime, _gmtime32, _gmtime64_fcvt_ecvtstrerror, _strerror, _wcserror, __wcserror
- Búfer utilizado por _putch, _putwch
- _set_invalid_parameter_handler, _set_thread_local_invalid_parameter_handler
- _set_new_handler y _set_new_mode
- fmode
- Información de zona horaria