Sdílet prostřednictvím


Globální stav v CRT

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

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

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

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

  • setlocale() ovlivňuje globální stav specifický pro aplikaci.
  • _o_setlocale() ovlivňuje 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 (tj. verze začínající _o_) kopii globálního stavu operačního systému místo kopie globálního stavu aplikace.

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

Existují dva způsoby izolace stavu CRT vaší komponenty od stavu CRT aplikace:

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

Poznámka:

Ve zdrojovém kódu napište setlocale(), ne _o_setlocale(). Při propojení ucrt.osmode.libs linkerem automaticky nahradí verzi funkce specifickou pro operační systém. To znamená, setlocale() že bude nahrazena _o_setlocale().

Propojení s ucrt.osmode.lib zákazem některých volání UCRT, která jsou dostupná jenom v režimu aplikace. Při pokusu o volání těchto funkcí dojde k chybě propojení.

Globální stav ovlivněný oddělením aplikací nebo operačního systému

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

Viz také

Referenční dokumentace knihovny runtime jazyka C