_environ
, _wenviron
La variable _environ
est un pointeur vers un tableau de pointeurs qui désignent les chaînes de caractères multioctets qui constituent l'environnement de processus. Cette variable globale a été déconseillée pour les versions getenv_s
fonctionnelles plus sécurisées, _wgetenv_s
et _putenv_s
, _wputenv_s
qui doivent être utilisées à 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 le Windows Runtime. Pour plus d’informations, consultez Fonctions CRT non prises en charge dans les applications de la plateforme Windows universelle.
Syntaxe
extern char **_environ;
Notes
Dans un programme qui utilise la fonction main
, _environ
est initialisé au démarrage du programme en fonction des paramètres tirés de l'environnement de système d'exploitation. L'environnement se compose d'une ou plusieurs entrées de la forme
ENVVARNAME
=string
getenv_s
et putenv_s
utilisent la variable _environ
pour accéder à la table d'environnement et la modifier. Quand _putenv
est appelé pour ajouter ou supprimer des paramètres d'environnement, la table d'environnement change de taille. Son emplacement dans la mémoire peut aussi changer, selon les besoins en mémoire du programme. La valeur de _environ
est automatiquement ajustée en conséquence.
La variable _wenviron
, déclarée dans Stdlib.h sous la forme :
extern wchar_t **_wenviron;
est une version à caractères larges de _environ
. Dans un programme qui utilise la fonction wmain
, _wenviron
est initialisé au démarrage du programme en fonction des paramètres tirés de l'environnement de système d'exploitation.
Dans un programme qui utilise main
, la valeur initiale de _wenviron
est NULL
, car l'environnement se compose de chaînes de caractères multioctets. Au premier appel à _wgetenv
ou _wputenv
, un environnement à chaînes de caractères larges correspondant est créé et est désigné par _wenviron
.
De la même manière, dans un programme qui utilise wmain
, la valeur initiale de _environ
est NULL
, car l'environnement se compose de chaînes de caractères larges. Au premier appel à _getenv
ou _putenv
, un environnement à chaînes de caractères multioctets correspondant est créé et est désigné par _environ
.
Quand deux copies de l'environnement (MBCS et Unicode) existent simultanément dans un programme, le système Runtime doit gérer les deux copies, ce qui entraîne des temps d'exécution plus lents. Par exemple, quand vous appelez _putenv
, un appel à _wputenv
est aussi exécuté automatiquement, de sorte que les deux chaînes d'environnement correspondent.
Attention
Dans de rares cas, quand le système Runtime gère à la fois une version Unicode et une version multioctet de l'environnement, ces deux versions d'environnement peuvent ne pas correspondre exactement. En effet, même si une chaîne de caractères multioctets unique est mappée à une chaîne Unicode unique, le mappage d'une chaîne Unicode unique à une chaîne de caractères multioctets n'est pas nécessairement unique. Par conséquent, deux chaînes Unicode distinctes peuvent être mappées à une même chaîne multioctet.
Interroger _environ
dans un contexte Unicode n'a pas de sens quand /MD ou une liaison /MDd
est utilisé. Pour la DLL CRT, le type (large ou multioctet) du programme est inconnu. Seul le type multioctet est créé, car il s'agit du scénario le plus probable.
Le pseudo-code suivant illustre la façon dont cette création 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")
Dans la notation utilisée pour cet exemple, les chaînes de caractères ne sont pas des littéraux de chaîne C ; ils sont plutôt des espaces réservés qui représentent des littéraux de chaîne d’environnement Unicode dans les _wputenv
chaînes d’environnement d’appel et multioctets dans l’appel putenv
. Les espaces réservés de caractères «x
» et «y
» dans les deux chaînes d’environnement Unicode distinctes ne sont pas mappés de manière unique aux caractères dans le MBCS actuel. Au lieu de cela, toutes deux sont mappées à un certain caractère MBCS « z
» qui est le résultat par défaut de la tentative de conversion des chaînes.
Ainsi, dans l'environnement multioctet, la valeur de « env_var_z
» après le premier appel implicite à putenv
est « string1
», mais cette valeur est remplacée au deuxième appel implicite à putenv
, quand « env_var_z
» a la valeur « string2
». L'environnement Unicode (dans _wenviron
) et l'environnement multioctet (dans _environ
) sont donc différents à la suite de cette série d'appels.
Voir aussi
Variables globales
getenv
, _wgetenv
getenv_s
, _wgetenv_s
_putenv
, _wputenv
_putenv_s
, _wputenv_s