Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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í
/MTkompilá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.liblinkeru (verze) nebo/NODEFAULTLIB:libucrtd.lib(ladění). A přidejteucrt.osmode.libdo 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:
- Data národního prostředí
- Obslužné rutiny signálu nastavené podle
signal - Rutiny ukončení nastavené podle
terminate -
errnoa_doserrno - Stav generování náhodných čísel používaný
randsrand - 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
_putchpoužívá ,_putwch -
_set_invalid_parameter_handler,_set_thread_local_invalid_parameter_handler -
_set_new_handlera_set_new_mode fmode- Informace o časovém pásmu