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:
- Dati delle impostazioni locali
- Gestori di segnale impostati da
signal
- Routine di terminazione impostate da
terminate
errno
e_doserrno
- Stato di generazione di numeri casuali usato da
rand
esrand
- Funzioni che restituiscono un buffer che l'utente non deve rilasciare:
strtok
,wcstok
,_mbstok
Tmpnam
,_wtmpnam
asctime
,_wasctime
gmtime
,_gmtime32
,_gmtime64
_fcvt
_ecvt
strerror
,_strerror
,_wcserror
__wcserror
- Buffer utilizzato da
_putch
,_putwch
_set_invalid_parameter_handler
,_set_thread_local_invalid_parameter_handler
_set_new_handler
e_set_new_mode
fmode
- Informazioni sul fuso orario