Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Vissa funktioner i UCRT (Universal C Runtime) använder globalt tillstånd. Till exempel setlocale() anger språkvarianten för hela programmet, vilket påverkar sifferavgränsare, textkodssida och så vidare.
UCRT:s globala tillstånd delas inte mellan program och operativsystemet. Om programmet till exempel anropar setlocale(), påverkar det inte de nationella inställningarna för OS-komponenter som använder C-körmiljön eller tvärtom.
OS-specifika versioner av CRT-funktioner
I UCRT finns det funktioner som interagerar med globalt tillstånd och har en "tvillingfunktion", prefixad med _o_. Till exempel:
- 
              setlocale()påverkar det globala tillstånd som är specifikt för appen.
- 
              _o_setlocale()påverkar det globala tillståndet som delas av alla OS-komponenter, men inte appar.
Den enda skillnaden mellan dessa "tvillingfunktioner" är att när de läser/skriver det globala CRT-tillståndet använder de OS-specifika versionerna (det vill säga de versioner som börjar med _o_) OS-kopian av globalt tillstånd i stället för appens kopia av det globala tillståndet.
De OS-specifika versionerna av dessa funktioner finns i ucrt.osmode.lib. Den OS-specifika versionen av setlocale() är till exempel _o_setlocale()
Det finns två sätt att isolera komponentens CRT-tillstånd från en apps CRT-tillstånd:
- Länka komponenten statiskt med hjälp av kompilatoralternativ /MT(version) eller/MTd(felsökning). Mer information finns i /MD, /MT, /LD. Statisk länkning kan avsevärt öka binär storlek.
- Från och med Windows-versioner som börjar med Windows 10 version 2004 länkar du dynamiskt till CRT men anropar os-lägesexporten (de funktioner som börjar med o). För att anropa OS-lägesexporterna länkar du statiskt som tidigare, men ignorerar den statiska UCRT genom att använda linker-alternativet /NODEFAULTLIB:libucrt.lib(release) eller/NODEFAULTLIB:libucrtd.lib(debug). Och lägg tillucrt.osmode.libi linker-indata. Mer information finns i/NODEFAULTLIB(Ignorera bibliotek).
Anmärkning
I källkoden skriver du setlocale(), inte _o_setlocale(). När du länkar mot ucrt.osmode.lib, ersätter länkaren automatiskt den operativsystemspecifika versionen av funktionen. Det vill: setlocale() kommer att ersättas med _o_setlocale().
Länkning mot ucrt.osmode.lib inaktiverar vissa UCRT-anrop som endast är tillgängliga i appläge. Om du försöker anropa dessa funktioner resulterar det i ett länkfel.
Globalt tillstånd som påverkas av app-/OS-separation
Globalt tillstånd som påverkas av uppdelningen av app- och OS-tillstånd omfattar:
- Lokala data
- Signalhanterare angivna av signal
- Avslutningsrutiner som anges av terminate
- 
              
              errnooch_doserrno
- Slumptalsgenereringstillstånd som används av randochsrand
- Funktioner som returnerar en buffert som användaren inte behöver släppa: strtok,wcstok,_mbstok
 Tmpnam,_wtmpnam
 asctime,_wasctime
 gmtime, ,_gmtime32_gmtime64
 _fcvt
 _ecvt
 strerror,_strerror, ,_wcserror__wcserror
- Bufferten som används av _putch,_putwch
- 
              
              _set_invalid_parameter_handler,_set_thread_local_invalid_parameter_handler
- 
              _set_new_handleroch_set_new_mode
- fmode
- Information om tidszon