Stato globale in CRT

Alcune funzioni in Universal C Runtime (UCRT) usano lo stato globale. Ad esempio, setlocale() imposta le impostazioni locali per l'intero programma, che influisce sui separatori di cifre, sulla tabella codici di testo e così via.

Lo stato globale di UCRT non è condiviso tra le applicazioni e il sistema operativo. Ad esempio, se l'applicazione chiama setlocale(), non influisce sulle impostazioni locali per i componenti del sistema operativo che usano il runtime C o in altro modo.

Versioni specifiche del sistema operativo delle funzioni CRT

In UCRT le funzioni che interagiscono con lo stato globale hanno una funzione "gemella", preceduta da _o_. Ad esempio:

  • setlocale() influisce sullo stato globale specifico dell'app.
  • _o_setlocale() influisce sullo stato globale condiviso da tutti i componenti del sistema operativo, ma non dalle app.

L'unica differenza tra queste funzioni "gemelle" è che quando leggono/scrivono lo stato CRT globale, le versioni specifiche del sistema operativo (ovvero le versioni che iniziano con _o_) usano la copia del sistema operativo dello stato globale anziché la copia dello stato globale dell'app.

Le versioni specifiche del sistema operativo di queste funzioni sono in ucrt.osmode.lib. Ad esempio, la versione specifica del sistema operativo di setlocale() è _o_setlocale()

Esistono due modi per isolare lo stato CRT del componente dallo stato CRT di un'app:

  • Collegare in modo statico il componente usando le opzioni /MT del compilatore (versione) o /MTd (debug). Per informazioni dettagliate, vedere /MD, /MT, /LD. Il collegamento statico può aumentare notevolmente le dimensioni binarie.
  • A partire dalle versioni di Windows a partire da Windows 10 versione 2004, collegare dinamicamente a CRT ma chiamare le esportazioni in modalità sistema operativo (le funzioni che iniziano con o). Per chiamare le esportazioni in modalità sistema operativo, collegare in modo statico come prima, ma ignorare ucrt statico usando l'opzione /NODEFAULTLIB:libucrt.lib del linker (versione) o /NODEFAULTLIB:libucrtd.lib (debug). ucrt.osmode.lib Aggiungere all'input del linker. Per informazioni dettagliate, vedere /NODEFAULTLIB (Ignora librerie).

Nota

Nel codice sorgente scrivere setlocale(), non _o_setlocale(). Quando si esegue il collegamento a ucrt.osmode.lib, il linker sostituirà automaticamente la versione specifica del sistema operativo della funzione. Vale a dire, setlocale() verrà sostituito con _o_setlocale().

Il collegamento a ucrt.osmode.lib disabilita alcune chiamate UCRT disponibili solo in modalità app. Il tentativo di chiamare queste funzioni genererà un errore di collegamento.

Stato globale interessato dalla separazione app/sistema operativo

Lo stato globale interessato dalla separazione dello stato dell'app e del sistema operativo include:

Vedi anche

Informazioni di riferimento sulla libreria di runtime C