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


_environ, _wenviron

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

Внимание

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

Синтаксис

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 . Заполнители символов "" и "xy" в двух разных строках среды Юникода не сопоставляют символы в текущем MBCS. Вместо этого они сопоставляются определенному символу многобайтовой кодировки "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