État global dans le CRT
Certaines fonctions du runtime C universel (UCRT) utilisent l’état global. Par exemple, setlocale()
définit les paramètres régionaux de l’ensemble du programme, ce qui affecte les séparateurs de chiffres, la page de codes texte, et ainsi de suite.
L’état global de l’UCRT n’est pas partagé entre les applications et le système d’exploitation. Par exemple, si votre application appelle setlocale()
, elle n’affecte pas les paramètres régionaux pour les composants du système d’exploitation qui utilisent le runtime C ou l’autre moyen.
Versions propres au système d’exploitation des fonctions CRT
Dans l’UCRT, les fonctions qui interagissent avec l’état global ont une fonction « jumeau », préfixée par _o_
. Par exemple :
setlocale()
affecte l’état global spécifique à l’application._o_setlocale()
affecte l’état global partagé par tous les composants du système d’exploitation, mais pas les applications.
La seule différence entre ces fonctions « jumeau » est que lorsqu’elles lisent/écrivent l’état CRT global, les versions spécifiques au système d’exploitation (c’est-à-dire les versions qui commencent par _o_
) utilisent la copie du système d’exploitation de l’état global au lieu de la copie de l’état global de l’application.
Les versions spécifiques au système d’exploitation de ces fonctions se trouvent dans ucrt.osmode.lib
. Par exemple, la version propre au système d’exploitation est setlocale()
_o_setlocale()
Il existe deux façons d’isoler l’état CRT de votre composant à partir de l’état CRT d’une application :
- Lier statiquement votre composant à l’aide des options
/MT
du compilateur (version) ou/MTd
(débogage). Pour plus d’informations, consultez /MD, /MT, /LD. La liaison statique peut augmenter considérablement la taille binaire. - À compter des versions de Windows commençant par Windows 10 version 2004, liez dynamiquement au CRT, mais appelez les exportations en mode système d’exploitation (fonctions commençant par o). Pour appeler les exportations en mode système d’exploitation, liez statiquement comme précédemment, mais ignorez l’UCRT statique à l’aide de l’option
/NODEFAULTLIB:libucrt.lib
éditeur de liens (mise en production) ou/NODEFAULTLIB:libucrtd.lib
(débogage). Ajoutez-yucrt.osmode.lib
l’entrée de l’éditeur de liens. Pour plus d’informations, consultez/NODEFAULTLIB
(Ignorer les bibliothèques).
Remarque
Dans le code source, écrivez setlocale()
, et non _o_setlocale()
. Lorsque vous liez une liaison ucrt.osmode.lib
, l’éditeur de liens remplace automatiquement la version spécifique au système d’exploitation de la fonction. C’est-à-dire, setlocale()
sera remplacé par _o_setlocale()
.
La liaison par rapport ucrt.osmode.lib
à désactive certains appels UCRT disponibles uniquement en mode application. La tentative d’appel de ces fonctions entraîne une erreur de lien.
État global affecté par la séparation de l’application/du système d’exploitation
L’état global affecté par la séparation de l’état de l’application et du système d’exploitation inclut :
- Données de paramètres régionaux
- Gestionnaires de signal définis par
signal
- Routines d’arrêt définies par
terminate
errno
et_doserrno
- État de génération de nombre aléatoire utilisé par
rand
etsrand
- Fonctions qui retournent une mémoire tampon que l’utilisateur n’a pas besoin de libérer :
strtok
, ,wcstok
_mbstok
Tmpnam
,_wtmpnam
asctime
,_wasctime
gmtime
,_gmtime32
,_gmtime64
_fcvt
_ecvt
strerror
,_strerror
,_wcserror
,__wcserror
- Mémoire tampon utilisée par
_putch
,_putwch
_set_invalid_parameter_handler
,_set_thread_local_invalid_parameter_handler
_set_new_handler
et_set_new_mode
fmode
- Informations sur le fuseau horaire