_environ, _wenviron
La variable d' _environ est un pointeur vers un tableau de pointeurs vers des chaînes de caractères multioctets qui constituent l'environnement de processus.Cette variable globale a été déconseillée pour les versions fonctionnels plus sécurisées getenv_s, _wgetenv_s et _putenv_s, _wputenv_s, qui doivent être utilisés à la place de la variable globale._environ est déclaré dans Stdlib.h.
Important
Cette API ne peut pas être utilisée dans les applications qui s'exécutent dans les fenêtres d'exécution.Pour plus d'informations, consultez Fonctions CRT non prises en charge avec /ZW.
extern char **_environ;
Notes
Dans un programme qui utilise la fonction d' main, _environ est initialisé au démarrage du programme en fonction de les configurations prises de l'environnement du système d'exploitation.L'environnement se compose d'un ou plusieurs entrées du formulaire
ENVVARNAME=string
getenv_s et putenv_s utilisent la variable d' _environ pour accéder et modifier au tableau d'environnement.Lorsque _putenv est appelé pour ajouter ou supprimer des paramètres d'environnement, la taille de modifications de tableau d'environnement.Son emplacement en mémoire peut également modifier, selon les besoins en mémoire du programme.La valeur d' _environ est automatiquement ajustée en conséquence.
La variable d' _wenviron, déclarée dans Stdlib.h comme suit :
extern wchar_t **_wenviron;
est une version à caractère élargi d' _environ.Dans un programme qui utilise la fonction d' wmain, _wenviron est initialisé au démarrage du programme en fonction de les configurations prises de l'environnement du système d'exploitation.
Dans un programme qui utilise main, _wenviron est initialement NULL parce que l'environnement est composé des chaînes de caractères multioctets.Au premier appel à _wgetenv ou à _wputenv, un environnement correspondant de chaîne à caractères larges est créé et variable globale pointe vers _wenviron.
De même, dans un programme qui utilise wmain, _environ est initialement NULL parce que l'environnement est composé des chaînes à caractères larges.Au premier appel à _getenv ou à _putenv, un environnement correspondant de chaîne de caractères multioctets est créé et variable globale pointe vers _environ.
Lorsque deux copies de l'environnement (MBCS et Unicode) existent simultanément dans un programme, le système runtime doit mettre à jour les deux copies, ce qui provoque une durée d'exécution plus lente.Par exemple, lorsque vous appelez _putenv, un appel à _wputenv est également exécuté automatiquement, afin que les deux chaînes d'environnement correspondant.
Attention |
---|
Dans des instances rares, lorsque le système runtime gère une version Unicode et une version multioctets de l'environnement, ces versions de deux environnements peuvent ne pas correspondre exactement.En effet, bien qu'aucune seule mappage de chaîne de caractères multioctets à une seule chaîne Unicode, le mappage d'une seule chaîne Unicode d'une chaîne de caractères multioctets ne soit nécessairement seule.Par conséquent, deux chaînes Unicode distinctes peuvent être mappées à la même chaîne multioctets. |
L'interrogation _environ dans un contexte Unicode est sans signification lorsque /MD ou la liaison d' /MDd est utilisé.Pour la DLL CRT, le type (large ou multioctets) du programme est inconnu.Seul le type multioctets est créé car il s'agit du scénario le plus probable.
Le pseudo-code suivant illustre comment cela peut se produire.
int i, j;
i = _wputenv( "env_var_x=string1" ); // results in the implicit call:
// putenv ("env_var_z=string1")
j = _wputenv( "env_var_y=string2" ); // also results in implicit call:
// putenv("env_var_z=string2")
En notation utilisée pour cet exemple, les chaînes ne sont pas des littéraux de chaîne C ; au contraire, elles sont les espaces réservés qui représentent des littéraux de chaîne d'environnement Unicode dans l'appel d' _wputenv et des chaînes multioctets d'environnement dans l'appel d' putenv .Les espaces réservés 'x' et 'y' de caractères dans les deux chaînes séparées d'environnement Unicode ne correspondent pas aux caractères du MBCS actuel.À la place, elles correspondent au caractère 'z' d'un certain MBCS qui est le résultat par défaut de la tentative de convertir les chaînes.
Par conséquent, dans l'environnement multioctets, la valeur « env_var_z » après le premier appel implicite à putenv soit « string1 », mais cette valeur est remplacée dans le deuxième appel implicite à putenv, lorsque la valeur « env_var_z » a « string2 ».L'environnement Unicode (dans _wenviron) et l'environnement multioctets (dans _environ) différeraient donc suivant cette série d'appels.