Udostępnij za pośrednictwem


_environ, _wenviron

Zmienna _environ jest wskaźnikiem do tablicy wskaźników do ciągów wielobajtowych znaków, które stanowią środowisko procesu. Ta zmienna globalna została uznana za przestarzałą dla bezpieczniejszych wersji funkcjonalnych getenv_si _putenv_s_wgetenv_s, _wputenv_sktóre powinny być używane zamiast zmiennej globalnej. _environ jest zadeklarowany w pliku Stdlib.h.

Ważne

Tego interfejsu API nie można używać w aplikacjach wykonywanych w środowisko wykonawcze systemu Windows. Aby uzyskać więcej informacji, zobacz Funkcje CRT nieobsługiwane w aplikacjach platforma uniwersalna systemu Windows.

Składnia

extern char **_environ;

Uwagi

W programie, który używa main funkcji, _environ jest inicjowany podczas uruchamiania programu zgodnie z ustawieniami pobranymi ze środowiska systemu operacyjnego. Środowisko składa się z co najmniej jednego wpisu formularza

ENVVARNAME =string

getenv_s i putenv_s użyj zmiennej _environ , aby uzyskać dostęp do tabeli środowiska i zmodyfikować ją. Po _putenv wywołaniu polecenia w celu dodania lub usunięcia ustawień środowiska tabela środowisk zmienia rozmiar. Jego lokalizacja w pamięci może również ulec zmianie, w zależności od wymagań dotyczących pamięci programu. Wartość parametru _environ jest odpowiednio dostosowana.

Zmienna _wenviron zadeklarowana w pliku Stdlib.h jako:

extern wchar_t **_wenviron;

jest wersją o szerokim znaku ._environ W programie, który używa wmain funkcji, _wenviron jest inicjowany podczas uruchamiania programu zgodnie z ustawieniami pobranymi ze środowiska systemu operacyjnego.

W programie, który używa mainmetody , _wenviron jest początkowo NULL ze względu na to, że środowisko składa się z ciągów wielobajtowych znaków. Na pierwszym wywołaniu metody _wgetenv lub _wputenvjest tworzone odpowiednie środowisko ciągów o szerokim znaku i jest wskazywane przez _wenviron.

Podobnie w programie, który używa wmainmetody , _environ jest początkowo NULL ze względu na to, że środowisko składa się z ciągów o szerokim znaku. Na pierwszym wywołaniu metody _getenv lub _putenvjest tworzone odpowiednie środowisko ciągów wielobajtowych znaków i jest wskazywane przez _environ.

Gdy dwie kopie środowiska (MBCS i Unicode) istnieją jednocześnie w programie, system czasu wykonywania musi obsługiwać obie kopie, co powoduje wolniejszy czas wykonywania. Na przykład za każdym razem, gdy wywołasz _putenvmetodę , wywołanie _wputenv metody jest również wykonywane automatycznie, tak aby dwa ciągi środowiska odpowiadały.

Uwaga

W rzadkich przypadkach, gdy system czasu wykonywania utrzymuje zarówno wersję Unicode, jak i wielobajtową wersję środowiska, te dwie wersje środowiska mogą nie odpowiadać dokładnie. Dzieje się tak dlatego, że każdy unikatowy ciąg wielobajtowy mapuje na unikatowy ciąg Unicode, mapowanie z unikatowego ciągu Unicode na ciąg wielobajtowy nie musi być unikatowe. W związku z tym dwa odrębne ciągi Unicode mogą być mapowanie na ten sam ciąg wielobajtowy.

Sondowanie _environ w kontekście Unicode jest bez znaczenia, gdy /MD lub /MDd linkage jest używany. W przypadku biblioteki DLL CRT typ (szeroki lub wielobajtowy) programu jest nieznany. Tworzony jest tylko typ wielobajtowy, ponieważ jest to najbardziej prawdopodobny scenariusz.

Poniższy pseudo-kod ilustruje, jak może się to zdarzyć.

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

W notacji używanej w tym przykładzie ciągi znaków nie są literałami ciągu języka C; zamiast tego są symbolami zastępczymi reprezentującymi literały ciągu środowiska Unicode w _wputenv wywołaniu i ciągami środowisk wielobajtowymi w wywołaniu putenv . Symbole zastępcze znaków "x" i "y" w dwóch odrębnych ciągach środowiska Unicode nie są mapowane unikatowo na znaki w bieżącym MBCS. Zamiast tego oba mapuj na jakiś znak MBCS "z", który jest domyślnym wynikiem próby przekonwertowania ciągów.

W związku z tym w środowisku wielobajtowym wartość "env_var_z" po pierwszym niejawnym wywołaniu putenv będzie "string1", ale ta wartość zostanie zastąpiona w drugim niejawnym wywołaniu metody putenv, gdy wartość "" jest ustawiona na "string2env_var_z". Środowisko Unicode (w systemie _wenviron) i środowisko wielobajtowe (w systemie _environ) różniłoby się w związku z tym po tej serii wywołań.

Zobacz też

Zmienne globalne
getenv, _wgetenv
getenv_s, _wgetenv_s
_putenv, _wputenv
_putenv_s, _wputenv_s