Condividi tramite


_environ, _wenviron

La variabile _environ è un puntatore ad un array di puntatori a stringhe di caratteri multibyte che costituiscono l'ambiente del processo. Questa variabile globale è stata deprecata a favore di versioni funzionali più sicure, getenv_s, _wgetenv_s e _putenv_s, _wputenv_s, che devono essere utilizzate al suo posto. _environ viene dichiarato in Stdlib.h.

Importante

Questa API non può essere utilizzata nelle applicazioni che vengono eseguite in Windows Runtime.Per ulteriori informazioni, vedere Funzioni CRT non supportate con /ZW.

extern char **_environ;

Note

In un programma che utilizza la funzione main, _environ è inizializzato all'avvio del programma in base alle impostazioni adottate dall'ambiente del sistema operativo. L'ambiente è costituito da uno o più voci del modulo

ENVVARNAME=string

getenv_s e putenv_s utilizzano la variabile _environ per accedere e modificare la tabella dell'ambiente. Quando _putenv viene chiamata per aggiungere o eliminare delle impostazioni di ambiente, le dimensioni della tabella dell'ambiente cambiano. La posizione in memoria può anche cambiare, a seconda dei requisiti di memoria del programma. Il valore di _environ viene adattata automaticamente di conseguenza.

La variabile _wenviron, dichiarata in Stdlib.h come:

extern wchar_t **_wenviron;

è una versione a caratteri wide di _environ. In un programma che utilizza la funzione wmain, _wenviron è inizializzato all'avvio del programma in base alle impostazioni adottate dall'ambiente del sistema operativo.

In un programma che utilizza main, _wenviron inizialmente è NULL perché l'ambiente è costituito da stringhe di caratteri multibyte. Alla prima chiamata a _wgetenv o a _wputenv, viene creato un ambiente corrispondente alla stringa con caratteri wide e viene puntato da _wenviron.

Allo stesso modo, in un programma che utilizza wmain, _environ è inizialmente NULL perché l'ambiente è costituito da stringhe di caratteri wide. Alla prima chiamata a _getenv o a _putenv, viene creato un ambiente corrispondente alla stringa con caratteri multibyte e viene puntato da _environ.

Quando due copie dell'ambiente (MBCS e Unicode) sono presenti contemporaneamente in un programma, il sistema runtime deve gestire entrambe le copie, con conseguente esecuzione più lenta. Ad esempio, ogni volta che viene chiamato _putenv, viene eseguita automaticamente anche una chiamata a _wputenv, in modo che le due stringhe dell'ambiente corrispondano.

Avviso

In rare occasioni, quando il sistema di run-time gestisce sia una versione Unicode che una versione multibyte dell'ambiente, queste due versioni dell'ambiente potrebbero non corrispondere esattamente.Ciò è dovuto al fatto che, sebbene ogni stringa univoca con caratteri multibyte viene mappata in una stringa Unicode univoca, il mapping da una stringa Unicode univoca a una stringa di caratteri multibyte non è sempre univoco.Di conseguenza, due stringhe Unicode distinte possono eseguire il mapping della stessa stringa multibyte.

Il polling di _environ in un contesto Unicode non è necessario quando viene utilizzato il collegamento /MD o /MDd. Per la DLL CRT, il tipo (wide o multibyte) del programma è sconosciuto. Verrà creato solo il tipo multibyte perché è lo scenario che si presenta più spesso.

Il seguente pseudocodice seguente mostra come ciò può verificarsi.

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")

Nella notazione utilizzata per questo esempio, le stringhe di caratteri non sono valori letterali stringa del linguaggio C; piuttosto, sono segnaposti che rappresentano valori letterali stringa dell'ambiente Unicode nella chiamata a _wputenv e stringhe dell'ambiente multibyte nella chiamata a putenv. I segnaposto "x" e "y" del carattere nelle due stringhe distinte dell'ambiente Unicode non sono associati in modo univoco ai caratteri nel corrente MBCS. Invece, entrambi eseguono il mapping a qualche carattere MBCS "z" che è il risultato predefinito del tentativo di conversione delle stringhe.

Pertanto, nell'ambiente multibyte, il valore di "env_var_z" dopo la prima chiamata implicita a putenv sarebbe "string1", ma questo valore verrà sovrascritto alla seconda chiamata implicita a putenv, quando il valore di "env_var_z" è impostato su "string2". Pertanto l'ambiente Unicode (in _wenviron) e l'ambiente multibyte (in _environ) differirebbero seguendo questa serie di chiamate.

Vedere anche

Riferimenti

Variabili globali

getenv, _wgetenv

getenv_s, _wgetenv_s

_putenv, _wputenv

_putenv_s, _wputenv_s