_environ
, _wenviron
Die _environ
-Variable ist ein Zeiger auf ein Array von Zeigern auf Multibyte-Zeichenfolgen, die die Prozessumgebung darstellen. Diese globale Variable ist für die sichereren funktionalen Versionen getenv_s
_wgetenv_s
veraltet und_putenv_s
sollte _wputenv_s
anstelle der globalen Variablen verwendet werden. _environ
wird in Stdlib.h deklariert.
Wichtig
Diese API kann nicht in Anwendungen verwendet werden, die in Windows-Runtime ausgeführt werden. Weitere Informationen finden Sie im Artikel CRT functions not supported in Universal Windows Platform apps (In Apps für die universelle Windows-Plattform nicht unterstützte CRT-Funktionen).
Syntax
extern char **_environ;
Hinweise
_environ
wird in einem Programm, das die main
-Funktion verwendet, gemäß den Einstellungen aus der Betriebssystemumgebung beim Programmstart initialisiert. Die Umgebung besteht aus mehreren Einträgen, die folgendes Format aufweisen:
ENVVARNAME
=string
getenv_s
und putenv_s
verwenden die _environ
-Variable, um auf die Umgebungstabelle zuzugreifen, und diese zu bearbeiten. Beim Aufruf von _putenv
zum Hinzufügen oder Löschen von Umgebungseinstellungen ändert sich die Größe der Umgebungstabelle. Darüber hinaus kann sich je nach Arbeitsspeicheranforderungen des Programms ihre Position im Arbeitsspeicher ändern. Der Wert von _environ
wird dementsprechend automatisch angepasst.
Die _wenviron
-Variable, die in STDLIB.H folgendermaßen deklariert ist,
extern wchar_t **_wenviron;
ist eine Breitzeichenversion von _environ
. _wenviron
wird in einem Programm, das die wmain
-Funktion verwendet, gemäß den Einstellungen aus der Betriebssystemumgebung beim Programmstart initialisiert.
In einem Programm, das main
verwendet, ist _wenviron
dementsprechend NULL
, da die Umgebung aus Multibyte-Zeichenfolgen besteht. Beim ersten Aufruf von _wgetenv
oder _wputenv
wird eine entsprechende Breitzeichenumgebung erstellt, auf die von _wenviron
gezeigt wird.
In einem Programm, das wmain
verwendet, ist _environ
dementsprechend NULL
, da die Umgebung aus Breitzeichenfolgen besteht. Beim ersten Aufruf von _getenv
oder _putenv
wird eine entsprechende Multibytezeichen-Umgebung erstellt, auf die von _environ
gezeigt wird.
Wenn in einem Programm zwei Kopien der Umgebung (MBCS und Unicode) gleichzeitig vorhanden sind, muss das Laufzeitsystem beide Kopien verwalten, wodurch sich die Ausführungszeit verlangsamt. Beispielsweise erfolgt bei jedem Aufruf von _putenv
automatisch auch ein Aufruf von _wputenv
, damit die beiden Umgebungszeichenfolgen übereinstimmen.
Achtung
In seltenen Fällen, wenn das Laufzeitsystem sowohl eine Unicodeversion als auch eine Multibyteversion der Umgebung verwaltet, stimmen diese zwei Versionen möglicherweise nicht exakt überein. Dies liegt daran, dass die Zuordnung von einer eindeutigen Unicodezeichenfolge zu einer Multibyte-Zeichenfolge nicht unbedingt eindeutig ist, obwohl sich jede eindeutige Multibyte-Zeichenfolge einer eindeutigen Unicodezeichenfolge zuordnen lässt. Aus diesem Grund sind möglicherweise zwei unterschiedliche Unicodezeichenfolgen der gleichen Multibyte-Zeichenfolge zugeordnet.
Der Abruf von _environ
in einem Unicodekontext ist bei Verwendung einer /MD- oder /MDd
-Verknüpfung ohne Bedeutung. Für die CRT-DLL ist der Typ des Programms (Breitzeichen oder Multibytezeichen) unbekannt. Es wird nur der Multibyte-Zeichentyp erstellt, da dies das wahrscheinlichste Szenario ist.
Der folgende Pseudocode veranschaulicht, wie diese Erstellung erfolgen kann.
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")
In der für dieses Beispiel verwendeten Schreibweise sind die Zeichenfolgen keine C-Zeichenfolgenliterale. Stattdessen sind sie Platzhalter, die Unicode-Umgebungszeichenfolgenliterale im _wputenv
Aufruf und Multibyte-Umgebungszeichenfolgen im putenv
Aufruf darstellen. Die Zeichenplatzhalter 'x
' und 'y
' in den beiden unterschiedlichen Unicode-Umgebungszeichenfolgen sind nicht eindeutig zeichen im aktuellen MBCS zugeordnet. Stattdessen sind beide dem MBCS-Zeichen „z
“ zugeordnet, was standardmäßig das Ergebnis des Versuchs darstellt, die Zeichenfolgen zu konvertieren.
In der Multibyte-Umgebung lautet der Wert von „env_var_z
“ folglich nach dem ersten impliziten Aufruf von putenv
„string1
“. Beim zweiten impliziten Aufruf von putenv
wird dieser Wert jedoch überschrieben, wenn der Wert von „env_var_z
“ auf „string2
“ festgelegt ist. Die Unicodeumgebung (in _wenviron
) und die Multibyteumgebung (in _environ
) weicht daher nach diesen Aufrufen ab.
Siehe auch
Globale Variablen
getenv
, _wgetenv
getenv_s
, _wgetenv_s
_putenv
, _wputenv
_putenv_s
, _wputenv_s