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řidejteucrt.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.lib
s 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:
- Data národního prostředí
- Obslužné rutiny signálu nastavené podle
signal
- Rutiny ukončení nastavené podle
terminate
errno
a_doserrno
- Stav generování náhodných čísel používaný
rand
srand
- Funkce, které vracejí vyrovnávací paměť, kterou uživatel nemusí uvolnit:
strtok
, ,wcstok
_mbstok
Tmpnam
,_wtmpnam
asctime
,_wasctime
gmtime
, ,_gmtime32
_gmtime64
_fcvt
_ecvt
strerror
,_strerror
, ,_wcserror
__wcserror
- Vyrovnávací paměť, kterou
_putch
používá ,_putwch
_set_invalid_parameter_handler
,_set_thread_local_invalid_parameter_handler
_set_new_handler
a_set_new_mode
fmode
- Informace o časovém pásmu