Share via


_environ、_wenviron

_environ 变量是指向构建进程环境的多字节字符串数组的指针,。 此全局变量因有更安全函数版本 _putenv_s、_wputenv_sgetenv_s、_wgetenv_s 而被废弃,这被使用来替代全局变量。 _environ 在Stdlib.h中被 声明。

重要

此 API 不能用于在 Windows 运行时中执行的应用程序。有关更多信息,请参见不支持 /ZW 的 CRT 函数

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 字符串可能映射到同一多字节字符串。

/MD 或 /MDd 链接被使用时,在 Unicode 上下文中轮询 _environ是无意义的。 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 字符串常量;相反,它们是占位符代表了在 _wputenv 调用中的Unicode环境字符串常量和在 putenv 调用中的多字节字符串。 在两个不同的Unicode环境字符串中的字符占位符 'x' 和 'y' 不能唯一映射到当前 MBCS 中的字符。 相反,会同时映射到某些 MBCS 字符 'z' 这是试图转换字符串的默认结果。

因此,在多字节环境中,在对 putenv 第一次隐含调用后 "env_var_z" 的值将会是 "string1,但这个值将会在对 putenv的第二次隐含调用时被重写,当"env_var_z"的值被设置成 "string2"。 Unicode环境 (在_wenviron中) 和多字节环境 ( 在_environ中)因此在下面这一系列的调用中会有所不同。

请参见

参考

全局变量

getenv、_wgetenv

getenv_s、_wgetenv_s

_putenv、_wputenv

_putenv_s、_wputenv_s