Глобальное состояние в CRTGlobal state in the CRT

Некоторые функции в универсальной среде выполнения C (UCRT) используют глобальное состояние.Some functions in the Universal C Runtime (UCRT) use global state. Например, setlocale() задает языковой стандарт для всей программы, который влияет на разделители цифр, текстовое кодовую страницу и т. д.For example, setlocale() sets the locale for the entire program, which affects the digit separators, text code page, and so on.

Глобальное состояние UCRT не является общим для приложений и ОС.The UCRT's global state isn't shared between applications and the OS. Например, если приложение вызывает setlocale() , оно не влияет на языковой стандарт для всех компонентов ОС, использующих время выполнения C, или наоборот.For example, if your application calls setlocale(), it won't affect the locale for any OS components that uses the C run-time, or the other way around.

Версии функций CRT для конкретной ОСOS-specific versions of CRT functions

В UCRT функции, взаимодействующие с глобальным состоянием, имеют функцию "двойника" с префиксом _o_ .In the UCRT, functions that interact with global state have a "twin" function, prefixed with _o_. Пример:For example:

  • setlocale() влияет на глобальное состояние, относящееся к приложению.setlocale() affects global state specific to the app.
  • _o_setlocale() влияет на глобальное состояние, совместно используемое всеми компонентами ОС, но не с приложениями._o_setlocale() affects global state shared by all OS components, but not apps.

Единственное различие между этими функциями "двойника" заключается в том, что при чтении и записи глобального состояния CRT версии, зависящие от ОС (то есть версии, начинающиеся с _o_ ), используют копию ОС глобального состояния вместо копии глобального состояния приложения.The only difference between these "twin" functions is that when they read/write the global CRT state, the OS-specific versions (that is, the versions that start with _o_) use the OS copy of global state instead of the app's copy of global state.

Версии этих функций, специфичные для ОС, находятся в ucrt.osmode.lib .The OS-specific versions of these functions are in ucrt.osmode.lib. Например, версия для конкретной ОС setlocale()_o_setlocale()For example, the OS-specific version of setlocale() is _o_setlocale()

Существует два способа изолировать состояние CRT компонента из состояния CRT приложения:There are two ways to isolate your component's CRT state from an app's CRT state:

  • Статическая компоновка компонента с помощью параметров компилятора /MT (Release) или /MTd (Отладка).Statically link your component by using compiler options /MT (release) or /MTd (debug). Дополнительные сведения см. в разделе /MD,/MT,/LD.For details, see /MD, /MT, /LD. Статическая компоновка может значительно увеличить двоичный размер.Static linking can greatly increase binary size.
  • Начиная с Windows 10 версии 2004, динамически связываются с CRT, но вызываются экспорты в режиме операционной системы (функции, начинающиеся с o).Starting with Windows 10 version 2004, dynamically link to the CRT but call the OS-mode exports (the functions that begin with o). Для вызова экспортов в режиме операционной системы статическим образом, как и прежде, но игнорировать статический UCRT с помощью параметра компоновщика /NODEFAULTLIB:libucrt.lib (Release) или /NODEFAULTLIB:libucrtd.lib (Debug).To call the OS-mode exports, statically link as before, but ignore the static UCRT by using linker option /NODEFAULTLIB:libucrt.lib (release) or /NODEFAULTLIB:libucrtd.lib (debug). И добавьте ucrt.osmode.lib к входным данным компоновщика.And add ucrt.osmode.lib to the linker input. Дополнительные сведения см. в разделе параметр /NODEFAULTLIB (Ignore Library) .See /NODEFAULTLIB (Ignore Libraries) for details.

Примечание

В исходном коде напишите setlocale() , а не _o_setlocale() .In source code, write setlocale(), not _o_setlocale(). При связывании с ucrt.osmode.lib Компоновщик автоматически подставляет версию функции, зависящую от ОС.When you link against ucrt.osmode.lib, the linker will automatically substitute the OS-specific version of the function. То есть setlocale() будет заменено на _o_setlocale() .That is, setlocale() will be substituted with _o_setlocale().

Связывание ucrt.osmode.lib используется для отключения некоторых вызовов UCRT, доступных только в режиме приложения.Linking against ucrt.osmode.lib disables some UCRT calls that are only available in app mode. Попытка вызова этих данных приведет к ошибке компоновки.Attempting to call these will result in a link error.

Глобальное состояние, затронутое разделением приложения или ОСGlobal state affected by app/OS separation

Глобальное состояние, затронутое разделением состояния приложения и ОС, включает:Global state affected by the separation of app and OS state includes:

См. такжеSee also

Справочник по библиотеке времени выполнения CC Run-Time library reference