_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_sanstelle 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 putenvstring1“. 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