Stan globalny w środowisku CRT
Niektóre funkcje w środowisku universal C Runtime (UCRT) używają stanu globalnego. Na przykład setlocale()
ustawia ustawienia regionalne dla całego programu, co wpływa na separatory cyfr, stronę kodów tekstowych itd.
Stan globalny UCRT nie jest udostępniany między aplikacjami a systemem operacyjnym. Jeśli na przykład aplikacja wywołuje setlocale()
metodę , nie wpłynie to na ustawienia regionalne dla żadnych składników systemu operacyjnego korzystających z czasu wykonywania języka C lub w inny sposób.
Wersje funkcji CRT specyficzne dla systemu operacyjnego
W funkcji UCRT, które współdziałają ze stanem globalnym, mają funkcję "bliźniaczej" z prefiksem _o_
. Na przykład:
setlocale()
wpływa na stan globalny specyficzny dla aplikacji._o_setlocale()
ma wpływ na stan globalny współużytkowany przez wszystkie składniki systemu operacyjnego, ale nie aplikacje.
Jedyną różnicą między tymi "bliźniaczymi" funkcjami jest to, że podczas odczytu/zapisu globalnego stanu CRT wersje specyficzne dla systemu operacyjnego (czyli wersje rozpoczynające się _o_
od ) używają kopii systemu operacyjnego stanu globalnego zamiast kopii stanu globalnego aplikacji.
Wersje tych funkcji specyficzne dla systemu operacyjnego znajdują się w systemie ucrt.osmode.lib
. Na przykład wersja setlocale()
specyficzna dla systemu operacyjnego to _o_setlocale()
Istnieją dwa sposoby izolowania stanu CRT składnika od stanu CRT aplikacji:
- Statyczne łączenie składnika przy użyciu opcji
/MT
kompilatora (wydania) lub/MTd
(debugowania). Aby uzyskać szczegółowe informacje, zobacz /MD, /MT, /LD. Łączenie statyczne może znacznie zwiększyć rozmiar binarny. - Począwszy od wersji systemu Windows począwszy od systemu Windows 10 w wersji 2004, dynamicznie połącz się z CRT, ale wywołaj eksporty w trybie systemu operacyjnego (funkcje, które zaczynają się od systemu operacyjnego). Aby wywołać eksporty w trybie systemu operacyjnego, statycznie połącz tak jak poprzednio, ale zignoruj statyczny protokół UCRT przy użyciu opcji
/NODEFAULTLIB:libucrt.lib
konsolidatora (wydanie) lub/NODEFAULTLIB:libucrtd.lib
(debugowanie).ucrt.osmode.lib
Dodaj do danych wejściowych konsolidatora. Aby uzyskać szczegółowe informacje, zobacz/NODEFAULTLIB
(Ignoruj biblioteki).
Uwaga
W kodzie źródłowym napisz setlocale()
, a nie _o_setlocale()
. Po połączeniu z ucrt.osmode.lib
usługą konsolidator automatycznie zastąpi wersję funkcji specyficzną dla systemu operacyjnego. Oznacza to, setlocale()
że zostanie zastąpiony ciągiem _o_setlocale()
.
Łączenie z elementem ucrt.osmode.lib
wyłącza niektóre wywołania UCRT, które są dostępne tylko w trybie aplikacji. Próba wywołania tych funkcji spowoduje błąd linku.
Stan globalny, którego dotyczy separacja aplikacji/systemu operacyjnego
Stan globalny, na który ma wpływ separacja stanu aplikacji i systemu operacyjnego, obejmuje:
- Dane ustawień regionalnych
- Programy obsługi sygnałów ustawione przez
signal
- Procedury kończenia ustawiane przez
terminate
errno
i_doserrno
- Stan generowania liczb losowych używany przez
rand
isrand
- Funkcje zwracające bufor, którego użytkownik nie musi zwolnić:
strtok
, ,wcstok
_mbstok
Tmpnam
,_wtmpnam
asctime
,_wasctime
gmtime
, ,_gmtime32
_gmtime64
_fcvt
_ecvt
strerror
, ,_strerror
, ,_wcserror
__wcserror
- Bufor używany przez
_putch
program ,_putwch
_set_invalid_parameter_handler
,_set_thread_local_invalid_parameter_handler
_set_new_handler
i_set_new_mode
fmode
- Informacje o strefie czasowej