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én ucrt.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:

Consulte también

Referencia de la biblioteca en tiempo de ejecución de C