_environ, _wenviron

_environ 变量是指向数组的指针封送到组合处理环境的多字节字符字符串。 此全局变量为更安全的函数版本 getenv_s, _wgetenv_s_putenv_s, _wputenv_s已弃用,应在全局变量位置。 _environ 在 Stdlib.h 声明。

重要

此 API 不能在运行时的窗口执行的应用程序。有关更多信息,请参见 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。

当环境的两个副本 (MBCS 和 Unicode) 时同时存在于程序,运行时系统必须保留两个副本,导致较慢的执行时间。 例如,在中,只要调用 _putenv,对 _wputenv 的调用也会自动执行,因此,两个环境字符串对应。

警告

在极少数情况下,那么,当该运行时系统维护一个 Unicode 版本和该环境中的某个多字节版本,这两个环境版本可能无法正确对应。这是因为,不过,任何单个多字节字符字符串映射到单个 Unicode 字符串,从单个 Unicode 字符串到多字节字符字符串不一定是唯一的。因此,两个不同的 Unicode 字符串可能映射到同一个多字节字符串。

当使用时,轮询 _environ 在 Unicode 上下文是无意义的 /MD 或 /MDd 连接。 对于 CRT DLL,类型 (宽或过多字节) 的程序是未知的。 因为它是这个最常见的方案中,只有多字节类型创建的。

以下伪代码阐释了如何发生。

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 字符串文本;相反,它们只是表示 Unicode 环境。_wputenv 的字符串写入名为的占位符,并在多字节 putenv 环境字符串调用。 在两个不同的 Unicode 环境字符串的字符占位符 'x' 和 'y' 不唯一地映射到当前 MBCS 的字符。 相反,两映射到由在尝试的默认值结果将字符串的某个 MBCS 字符 'z'。

因此,在多字节环境中,“env_var_z”值,第一个隐式调用 putenv 为“string1”后,但是,此值在第二个隐式将复盖对 putenv,那么,当“env_var_z”值设置为“string2”。 Unicode 环境 (在 _wenviron) 和多字节环境 (在 _environ) 因此会不同遵循这一系列调用。

请参见

参考

全局变量

getenv, _wgetenv

getenv_s, _wgetenv_s

_putenv, _wputenv

_putenv_s, _wputenv_s