_environ、_wenviron
_environ 變數是指標對指標陣列撰寫處理環境的多位元組字元字串。 這個全域變數已不宜用,亦被更安全的版本getenv_s、_wgetenv_s 和 _putenv_s、_wputenv_s所取代。 _environ 在 Stdlib.h 宣告。
重要
這個應用程式開發介面不能用於 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 的方式也會自動執行,因此,這兩個環境字串對應。
警告
在極少的情況下,當這個 Runtime 系統維護的 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# 字串常值 (String Literal);相反地,它們是表示 Unicode 環境在 _wputenv 呼叫的字串常值和多位元組在 putenv 呼叫環境字串的預留位置。 在兩個不同的 Unicode 環境字串的字元預留位置 'x' 和 'y' 不唯一對應至目前的 MBCS 字元。 相反地,兩個對應至某一 MBCS 是嘗試的預設結果字串轉換字元的 'z' 。
因此,在多位元組環境, 「env_var_z」的值,在 putenv 的第一個隱含呼叫是「string1」之後,不過,這個值會對應至 putenv的第二個隱含呼叫將覆寫,,當「env_var_z」的值設定為「string2」時。 Unicode 環境 ( _wenviron) 和多位元組環境 ( _environ) 以便將不同之後呼叫這個系列。