_environ
, _wenviron
La variable _environ
es un puntero a una matriz de punteros a las cadenas de caracteres multibyte que constituyen el entorno de proceso. Esta variable global ha quedado en desuso para las versiones funcionales más seguras y_putenv_s
_wgetenv_s
,_wputenv_s
, que se deben usar en lugar de la variable global.getenv_s
_environ
está declarado en Stdlib.h.
Importante
Esta API no se puede usar en aplicaciones que se ejecutan en Windows en tiempo de ejecución. Para obtener más información, vea Funciones de CRT no admitidas en aplicaciones de la Plataforma universal de Windows.
Sintaxis
extern char **_environ;
Comentarios
En un programa que usa la función main
, _environ
se inicializa al inicio del programa según la configuración efectuada en el entorno del sistema operativo. El entorno consta de una o varias entradas del formulario
ENVVARNAME
=string
getenv_s
y putenv_s
usan la variable _environ
para acceder a la tabla de entorno y modificarla. Al llamar a _putenv
para agregar o eliminar la configuración del entorno, la tabla de entorno cambia de tamaño. También puede cambiar su ubicación en la memoria, en función de los requisitos de memoria del programa. El valor de _environ
se ajusta automáticamente según corresponda.
La variable _wenviron
, que se declara en Stdlib.h como:
extern wchar_t **_wenviron;
es una versión con caracteres anchos de _environ
. En un programa que usa la función wmain
, _wenviron
se inicializa al inicio del programa según la configuración efectuada en el entorno del sistema operativo.
En un programa que usa main
, _wenviron
es inicialmente NULL
porque el entorno está formado por cadenas de caracteres multibyte. En la primera llamada a _wgetenv
o _wputenv
, se crea un entorno de cadena de caracteres anchos que apunta a _wenviron
.
De forma similar, en un programa que usa wmain
, _environ
es inicialmente NULL
porque el entorno está formado por cadenas de caracteres anchos. En la primera llamada a _getenv
o _putenv
, se crea un entorno de cadena de caracteres multibyte que apunta a _environ
.
Si dos copias del entorno (MBCS y Unicode) existen simultáneamente en un programa, el sistema en tiempo de ejecución debe mantener las dos copias, lo que ralentiza el tiempo de ejecución. Por ejemplo, cada vez que se llame a _putenv
, se ejecuta automáticamente una llamada a _wputenv
, de forma que se correspondan las dos cadenas de entorno.
Precaución
En raras ocasiones, cuando el sistema en tiempo de ejecución mantiene una versión Unicode y una versión multibyte del entorno, las dos versiones del entorno podrían no corresponderse exactamente. La razón es que, aunque cualquier cadena de caracteres multibyte se asigna a una cadena de Unicode única, la asignación de una cadena de Unicode única a una cadena de caracteres multibyte no es necesariamente única. Por lo tanto, podría haber dos cadenas Unicode distintas que se asignan a la misma cadena multibyte.
Sondear _environ
en un contexto Unicode no tiene sentido si se usa la vinculación /MD o /MDd
. Para el archivo DLL de CRT, el tipo (ancho o multibyte) del programa es desconocido. Dado que se trata del caso más probable, solo se crea el tipo multibyte.
El siguiente pseudocódigo ilustra cómo puede ocurrir esta creación.
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 la notación usada para este ejemplo, las cadenas de caracteres no son literales de cadena C; en su lugar, son marcadores de posición que representan literales de cadena de entorno Unicode en las cadenas de _wputenv
entorno de llamada y multibyte de la putenv
llamada. Los marcadores de posición de caracteres 'x
' y 'y
' de las dos cadenas de entorno Unicode distintas no se asignan de forma única a los caracteres del MBCS actual. En su lugar, ambas se asignan a algún carácter de MBCS 'z
', que es el resultado predeterminado del intento de convertir las cadenas.
Por lo tanto, en el entorno multibyte, el valor de "env_var_z
" después de la primera llamada implícita a putenv
sería "string1
", pero este valor se sobrescribiría en la segunda llamada implícita a putenv
, cuando el valor de "env_var_z
" se establece en "string2
". Por lo tanto, el entorno de Unicode (en _wenviron
) y el entorno multibyte (en _environ
) serían diferentes según esta serie de llamadas.
Consulte también
Variables globales
getenv
, _wgetenv
getenv_s
, _wgetenv_s
_putenv
, _wputenv
_putenv_s
, _wputenv_s