Compartir a través de


_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