Estado global en CRT
Algunas funciones de Universal C Runtime (UCRT) usan el estado global. Por ejemplo, setlocale()
establece la configuración regional de todo el programa, que afecta a los separadores de dígitos, la página de códigos de texto, etc.
El estado global de UCRT no se comparte entre las aplicaciones y el sistema operativo. Por ejemplo, si la aplicación llama a setlocale()
, no afectará a la configuración regional de los componentes del sistema operativo que usen el tiempo de ejecución de C, o al revés.
Versiones específicas del sistema operativo o funciones de CRT
En UCRT, las funciones que interactúan con el estado global tienen una función "gemelo", con el prefijo _o_
. Por ejemplo:
setlocale()
afecta al estado global específico de la aplicación._o_setlocale()
afecta al estado global que comparten todos los componentes del sistema operativo, pero no a las aplicaciones.
La única diferencia entre estas funciones "gemelas" estriba en que cuando leen y escriben el estado de CRT global, las versiones específicas del sistema operativo (es decir, las versiones que comienzan por _o_
) usan la copia del sistema operativo del estado global en lugar de la copia del estado global de la aplicación.
Las versiones específicas del sistema operativo de estas funciones se encuentran 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 opciones del compilador
/MT
(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 10, versión 2004, se vincula dinámicamente al CRT, pero debe llamar a las exportaciones en modo de sistema operativo (las funciones que comienzan por o). Para llamar a las exportaciones en modo de sistema operativo, vincule estáticamente como antes, pero omita la UCRT estática mediante la opción del enlazador
/NODEFAULTLIB:libucrt.lib
(versión) o/NODEFAULTLIB:libucrtd.lib
(depuración). Agregue tambiénucrt.osmode.lib
a la entrada del enlazador. Consulte/NODEFAULTLIB
(Omitir bibliotecas) para obtener más información.
Nota:
En el código fuente, escriba setlocale()
, no _o_setlocale()
. Cuando se vincula con ucrt.osmode.lib
, el enlazador sustituye automáticamente la versión específica del sistema operativo de la función. Es decir, setlocale()
se sustituirá por _o_setlocale()
.
La vinculación con ucrt.osmode.lib
deshabilita algunas llamadas UCRT que solo están disponibles en el modo de aplicación. Si intenta llamar a estas funciones, se producirá un error de vínculo.
Estado global afectado por la separación de la aplicación y el sistema operativo
El estado global afectado por la separación de la aplicación y el estado del sistema operativo incluye lo siguiente:
- Datos de configuración regional.
- Controladores de señal establecidos por
signal
- Rutinas de terminación establecidas por
terminate
errno
y_doserrno
- Estado de generación de números aleatorios usado por
rand
ysrand
- Funciones que devuelven un búfer que el usuario no necesita liberar:
strtok
, ,wcstok
_mbstok
Tmpnam
,_wtmpnam
asctime
,_wasctime
gmtime
,_gmtime32
,_gmtime64
_fcvt
_ecvt
strerror
,_strerror
,_wcserror
,__wcserror
- El búfer usado 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