Поделиться через


_environ, _wenviron

Переменная _environ является указателем на массив указателей на строки многобайтовых символов, которые составляют среду процесса. Эта глобальная переменная не рекомендуются в силу наличия более безопасных функциональных версий getenv_s, _wgetenv_s and _putenv_s, _wputenv_s, которые должны использоваться вместо этой переменной. _environ объявлена в Stdlib.h.

Важно!

Этот API невозможно использовать в приложениях, запускаемых в среде выполнения Windows.Дополнительные сведения см. в статье Функции CRT, которые не поддерживаются с ключом /ZW.

extern char **_environ;

Заметки

В программе, которая использует функцию main, _environ инициализируется при запуске программы в соответствии с принятым из среды операционной системы параметрами. Среда состоит из одной или нескольких записей формы

ENVVARNAME=string

getenv_s и putenv_s используют переменную _environ для получения доступа к таблице среды и ее изменения. Когда _putenv вызывается для добавления или удаления параметров среды, таблица среды изменяется в размере. Ее расположение в памяти также может изменяться в зависимости от требований к памяти программы. Значение _environ автоматически изменяется соответствующим образом.

Переменная _wenviron объявлена в Stdlib.h как:

extern wchar_t **_wenviron;

версия _environ для расширенных символов. В программе, которая использует функцию wmain, _wenviron инициализируется при запуске программы в соответствии с принятым из среды операционной системы параметрами.

В программе, которая использует main, _wenviron изначально равно NULL, поскольку среда состоит из строк многобайтовых символов. При первом вызове _wgetenv или _wputenv, создается соответствующая среда строк расширенных символов, на которую указывает _wenviron.

Аналогично, в программе, которая использует wmain, _environ изначально равно NULL, поскольку среда состоит из расширенных строк. При первом вызове _getenv или _putenv, создается соответствующая среда строк многобайтовых символов, на которую указывает _environ.

Когда две копии среды (многобайтовой кодировки и Юникода) существуют одновременно в программе, система времени выполнения должна поддерживать обе копии, что отрицательно сказывается на скорости выполнения программы. Например, при вызове _putenv, вызов _wputenv также выполняется автоматически, чтобы две строки среды совпадали.

Предупреждение

В редких случаях, когда во система времени выполнения поддерживает и версию Юникода, и многобайтовую версию, эти две версии среды могут не соответствовать точно.Это происходит потому, что, хотя любая уникальная расширенная строка сопоставлена уникальной строке Юникода, сопоставление уникальной строки Юникода со строкой многобайтовой кодировки не обязательно будет уникальными.Поэтому две различных строки Юникода могут сопоставляться одной и той же многобайтовой строке.

Запрос _environ в контексте Юникода не имеет смысла, если используется компоновка /MD или /MDd. Для библиотеки DLL CRT тип (расширенный или многобайтовый) программы неизвестен. Создается только многобайтовый тип, поскольку это наиболее вероятный сценарий.

Следующий псевдокод иллюстрирует, как это может произойти.

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

В нотации, используемой для данного примера, символьные строки нет являются строковыми литералами C; скорее они заполнители, которые представляют строковые литералы среды юникода в вызове _wputenv и строки многобайтовой среды в вызове putenv. Заполнители символов 'x' и 'y' в двух различных строках среды Юникода не сопоставляются однозначно символам в текущей многобайтовой кодировке. Вместо этого они соответствуют определенному символу многобайтовой кодировки 'z', которые является результатом по умолчанию попытки преобразовать строки.

Поэтому в многобайтовых средах значение «env_var_z» после первого неявного вызова putenv будет равно «string1», но это значение будет перезаписано при втором неявном вызове putenv, если значение «env_var_z» будет установлено в значение «string2». Среда Юникода (в _wenviron) и многобайтовая среда (в _environ) будут, следовательно, отличаться следующей серией вызовов.

См. также

Ссылки

Глобальные переменные

getenv, _wgetenv

getenv_s, _wgetenv_s

_putenv, _wputenv

_putenv_s, _wputenv_s