次の方法で共有


_environ, _wenviron

_environ 変数は、プロセスの環境を構成するマルチバイト文字列へのポインターの配列を指すポインターです。 このグローバル変数は、グローバル変数の代わりに使用する必要がある、_wputenv_sgetenv_s_wgetenv_s_putenv_sのより安全な機能バージョンでは非推奨になりました。 _environ は Stdlib.h で宣言されています。

重要

この API は、Windows ランタイムで実行するアプリケーションでは使用できません。 詳細については、「ユニバーサル Windows プラットフォーム アプリでサポートされていない CRT 関数」を参照してください。

構文

extern char **_environ;

解説

main 関数を使用するプログラムでは、_environ は、オペレーティング システムの環境から取られる設定に従って、プログラムの起動時に初期化されます。 環境は、次の形式の 1 つ以上のエントリから構成されます。

ENVVARNAME =string

getenv_sputenv_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