Globální stav v CRT

Některé funkce v modulu Universal C Runtime (UCRT) používají globální stav. Nastaví například národní prostředí pro celý program, které má vliv na oddělovače číslic, znakovou stránku textu setlocale() atd.

Globální stav UCRT není mezi aplikacemi a operačním systémem sdílený. Pokud například vaše aplikace volá , nebude mít vliv na národní prostředí pro žádné komponenty operačního systému, které používají běh setlocale() jazyka C, ani naopak.

Verze funkcí CRT specifické pro operační systém

V UCRT mají funkce, které komunikují s globálním stavem, funkci dvojčete s předponou _o_ . Například:

  • setlocale() má vliv na globální stav specifický pro aplikaci.
  • _o_setlocale() má vliv na globální stav sdílený všemi komponentami operačního systému, ale ne aplikacemi.

Jediným rozdílem mezi těmito funkcemi dvojčete je, že při čtení a zápisu globálního stavu CRT používají verze specifické pro operační systém (to znamená, že verze, které začínají na ) kopii globálního stavu operačního systému místo kopie globálního stavu _o_ aplikace.

Verze těchto funkcí specifické pro operační systém jsou v ucrt.osmode.lib systému . Například verze nástroje specifická pro operační setlocale() systém je _o_setlocale()

Existují dva způsoby, jak izolovat stav CRT vaší komponenty od stavu CRT aplikace:

  • Staticky propoojte komponentu pomocí možností /MT kompilátoru (verze) /MTd nebo (ladění). Podrobnosti najdete v tématu /MD, /MT, /LD. Statické propojení může výrazně zvětšit binární velikost.
  • Počínaje verzí Windows počínaje verzí Windows 10 2004 dynamicky propojekci s CRT, ale volejte exporty v režimu operačního systému (funkce, které začínají na o). Pokud chcete volat exporty v režimu operačního systému, staticky propojujte jako předtím, ale ignorujte statickou metodu UCRT pomocí možnosti linkeru /NODEFAULTLIB:libucrt.lib (verze) /NODEFAULTLIB:libucrtd.lib nebo (ladění). A ucrt.osmode.lib přidejte do vstupu linkeru. Podrobnosti najdete v tématu /NODEFAULTLIB (ignorování knihoven).

Poznámka

Ve zdrojovém kódu napište setlocale() , ne _o_setlocale() . Když budete odkazovat na , linker automaticky nahradí verzi funkce specifickou ucrt.osmode.lib pro operační systém. To znamená, setlocale() že se nahradí za _o_setlocale() .

Propojení proti ucrt.osmode.lib zakáže některá volání UCRT, která jsou dostupná jenom v režimu aplikace. Pokus o jejich volání bude mít za následek chybu propojení.

Globální stav ovlivněný oddělením aplikací a operačních systémů

Globální stav ovlivněný oddělením stavu aplikace a operačního systému zahrnuje:

Viz také

Referenční informace Run-Time knihoven jazyka C