_environ、_wenviron
更新 : 2007 年 11 月
_environ 変数は、プロセス環境を構成するマルチバイト文字へのポインタ配列のポインタです。Visual C++ 2005 では、セキュリティが強化されたバージョンの getenv_s、_wgetenv_s および _putenv_s、_wputenv_s が機能するようになったため、このグローバル変数は使用されなくなりました。このグローバル変数の代わりに、セキュリティが強化されたバージョンを使用する必要があります。_environ は、Stdlib.h で宣言されています。
extern char **_environ;
解説
main 関数を使用するプログラムでは、プログラム起動時にオペレーティング システム環境の設定に基づいて _environ が初期化されます。この環境は、次の形式を持つ 1 つ以上のエントリで構成されています。
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 によって参照されます。
2 つの環境のコピー (MBCS および Unicode) がプログラムに同時に存在する場合、ランタイム システムは、両方のコピーを保持する必要があるため、実行時間が長くなります。たとえば、_putenv を呼び出す場合は、2 つの環境文字列が対応するように _wputenv も自動的に呼び出されます。
注意 : |
---|
まれに、ランタイム システムが Unicode 環境とマルチバイト環境の両方を保持している場合、これら 2 つの環境が正確に対応しないことがあります。これは、一意のマルチバイト文字列はすべて一意の Unicode 文字列に対応していますが、一意の Unicode 文字列は必ずしも一意のマルチバイト文字列に対応していないためです。そのため、2 つの異なる 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 呼び出しではマルチバイト環境のリテラル文字列を表すプレースホルダです。'x' および 'y' という文字プレースホルダは、Unicode 環境では別の文字列ですが、現在の MBCS の文字には一意に対応していません。どちらの文字も MBCS の特定の文字 'z' に対応し、文字列を変換すると、既定ではこの文字に変換されます。
このため、マルチバイト環境では、"env_var_z" の値は、最初に putenv が暗黙的に呼び出された後、"string1" になりますが、2 回目に putenv が暗黙的に呼び出された時点で、"env_var_z" が "string2" に設定されて上書きされます。したがって、Unicode 環境 (_wenviron) とマルチバイト環境 (_environ) では、一連の呼び出しの結果が異なります。