Глобальное состояние в 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 adducrt.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:
- Данные языкового стандартаLocale data
- Обработчики сигналов, заданные сигналомSignal handlers set by signal
- Подпрограммы завершения заданы методом TerminateTermination routines set by terminate
- пере_doserrnoerrno and _doserrno
- Состояние генерации случайных чисел, используемое СЛЧИС и srandRandom number generation state used by rand and srand
- Функции, возвращающие буфер, который пользователю не нужно выпустить: strtok, wcstok, _mbstok tmpnam, _wtmpnam asctime, _wasctime gmtime, _gmtime32, _gmtime64 _fcvt _ecvt strerror, _strerror, _wcserror, __wcserrorFunctions that return a buffer that the user doesn't need to release: strtok, wcstok, _mbstok Tmpnam, _wtmpnam asctime, _wasctime gmtime, _gmtime32, _gmtime64 _fcvt _ecvt strerror, _strerror, _wcserror, __wcserror
- Буфер , используемый _putch _putwchThe buffer used by _putch, _putwch
- _set_invalid_parameter_handler, _set_thread_local_invalid_parameter_handler_set_invalid_parameter_handler, _set_thread_local_invalid_parameter_handler
- _set_new_handler и _set_new_mode_set_new_handler and _set_new_mode
- фмодеfmode
- Сведения о часовом поясеTime zone information
См. такжеSee also
Справочник по библиотеке времени выполнения CC Run-Time library reference