Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Некоторые функции в универсальной среде выполнения C (UCRT) используют глобальное состояние. Например, setlocale() задает языковой стандарт для всей программы, которая влияет на разделители цифр, текстовую кодовую страницу и т. д.
Глобальное состояние UCRT не совместно используется между приложениями и ОС. Например, если приложение вызывается setlocale(), он не повлияет на языковой стандарт для каких-либо компонентов ОС, использующих время выполнения C или другой способ.
Версии функций CRT для определенных ОС
В UCRT функции, взаимодействующие с глобальным состоянием, имеют функцию двойника, префиксированную с _o_. Например:
-
setlocale()влияет на глобальное состояние, конкретное для приложения. -
_o_setlocale()влияет на глобальное состояние, совместно используемое всеми компонентами ОС, но не приложениями.
Единственное различие между этими функциями двойника заключается в том, что при чтении и записи глобального состояния CRT версии для конкретной ОС (то есть версии, начинающиеся с _o_) используют копию глобального состояния, а не копию глобального состояния приложения.
Версии этих функций ucrt.osmode.libзависят от ОС. Например, версия операционной setlocale() системы _o_setlocale()
Существует два способа изоляции состояния CRT компонента от состояния CRT приложения:
- Статически связывая компонент с помощью параметров
/MTкомпилятора (выпуск) или/MTd(отладка). Дополнительные сведения см. в разделе /MD, /MT, /LD. Статическое связывание может значительно увеличить двоичный размер. - Начиная с версий Windows, начиная с Windows 10 версии 2004, динамически ссылаться на CRT, но вызывать экспорт в режиме ОС (функции, начинающиеся с o). Чтобы вызвать экспорт в режиме ОС, статически связывать как раньше, но игнорировать статический UCRT с помощью параметра
/NODEFAULTLIB:libucrt.libкомпоновщика (выпуск) или/NODEFAULTLIB:libucrtd.lib(отладка). И добавьтеucrt.osmode.libв входные данные компоновщика. Дополнительные сведения см. в разделе/NODEFAULTLIB(игнорировать библиотеки ).
Примечание.
В исходном коде запись setlocale(), а не _o_setlocale(). При связывании со ucrt.osmode.libссылкой компоновщик автоматически заменит версию функции для конкретной ОС. То есть setlocale() будет заменено _o_setlocale()на .
Связывание отключает ucrt.osmode.lib некоторые вызовы UCRT, доступные только в режиме приложения. Попытка вызова этих функций приведет к ошибке ссылки.
Глобальное состояние, затронутое разделением приложений и ОС
Глобальное состояние, затронутое разделением состояния приложения и ОС, включает:
- Данные языкового стандарта
- Обработчики сигналов, заданные по
signal - Подпрограммы завершения, заданные по
terminate -
errnoи_doserrno. - Состояние случайного создания чисел, используемое
randиsrand - Функции, возвращающие буфер, который пользователь не должен выпускать:
strtok,wcstok_mbstok
Tmpnam,_wtmpnam
asctime,_wasctime
gmtime, ,_gmtime32_gmtime64
_fcvt
_ecvt
strerror, ,_strerror_wcserror__wcserror - Буфер, используемый
_putch,_putwch -
_set_invalid_parameter_handler,_set_thread_local_invalid_parameter_handler -
_set_new_handlerи_set_new_mode. fmode- Сведения о часовом поясе