_environ
, _wenviron
_environ
変数は、プロセスの環境を構成するマルチバイト文字列へのポインターの配列を指すポインターです。 このグローバル変数は、グローバル変数の代わりに使用する必要がある、_wputenv_s
getenv_s
、_wgetenv_s
、_putenv_s
のより安全な機能バージョンでは非推奨になりました。 _environ
は Stdlib.h で宣言されています。
重要
この API は、Windows ランタイムで実行するアプリケーションでは使用できません。 詳細については、「ユニバーサル Windows プラットフォーム アプリでサポートされていない CRT 関数」を参照してください。
構文
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 文字列が、同一のマルチバイト文字列にマップされる可能性があります。
Unicode コンテキストで _environ
をポーリングすることは、/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 文字列リテラルではありません。代わりに、 _wputenv
呼び出しの Unicode 環境文字列リテラルと、 putenv
呼び出しのマルチバイト環境文字列を表すプレースホルダーです。 2 つの異なる Unicode 環境文字列の文字プレースホルダー 'x
' と 'y
' は、現在の MBCS の文字に一意にマップされません。 その代わりに、両方は何かの MBCS 文字 'z
' にマップされます。これは、文字列を変換しようとした場合の既定の結果です。
したがって、マルチバイト環境では、値 "env_var_z
" は putenv
への最初の暗黙的な呼び出しの後には "string1
" ですが、putenv
への 2 回目の暗黙的な呼び出しでこの値は上書きされ、"env_var_z
" の値は "string2
" に設定されます。 Unicode 環境 (_wenviron
にある) およびマルチバイト環境 (_environ
にある) は、この一連の呼び出しの後には異なっていることになります。
関連項目
グローバル変数
getenv
, _wgetenv
getenv_s
, _wgetenv_s
_putenv
, _wputenv
_putenv_s
, _wputenv_s