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í
/MTkompilátoru (verze)/MTdnebo (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.libnebo (ladění). Aucrt.osmode.libpř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:
- Data národního prostředí
- Obslužné rutiny signálu nastavené signálem
- Rutiny ukončení nastavené pomocí terminate
- errno a _doserrno
- Stav generování náhodných čísel používaný funkcemi rand a srand
- Funkce, které vrací vyrovnávací paměť, kterou uživatel nemusí vydat: strtok, wcstok, _mbstokTmpnam, _wtmpnamasctime, _wasctimegmtime, _gmtime32, _gmtime64_fcvt_ecvtstrerror, _strerror, _wcserror, __wcserror
- Vyrovnávací paměť používaná _putch, _putwch
- _set_invalid_parameter_handler, _set_thread_local_invalid_parameter_handler
- _set_new_handlera _set_new_mode
- režim fmode
- Informace o časovém pásmu