Udostępnij za pośrednictwem


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.libusł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:

Zobacz też

Dokumentacja biblioteki czasu wykonywania języka C