Dela via


Globalt tillstånd i CRT

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 till ucrt.osmode.lib i 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:

Se även

Referens för C Run-Time-bibliotek