getenv, _wgetenv

現在の環境から値を取得します。 これらの関数のセキュリティを強化したバージョンを使用できます。「getenv_s_wgetenv_s」を参照してください。

重要

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

構文

char *getenv(
   const char *varname
);
wchar_t *_wgetenv(
   const wchar_t *varname
);

パラメーター

varname
環境変数名。

戻り値

varname を含む環境のテーブル エントリへのポインターを返します。 返されたポインターを使用して環境変数の値を変更しても安全ではありません。 環境変数の値を変更するには、_putenv 関数を使用します。 戻り値は、 NULL 環境テーブルに見つからない場合 varname です。

解説

getenv 関数は、環境変数のリストから varname を検索します。 Windows オペレーティング システムでは、getenv は大文字と小文字を区別しません。 getenv 関数と _putenv 関数は、_environ グローバル変数が指す環境のコピーを使用して環境にアクセスします。 getenv は、ランタイム ライブラリからアクセスできるデータ構造体だけを対象とし、プロセス用にオペレーティング システムで作成された環境 "セグメント" は参照しません。 そのため、プログラムで main または wmain の引数 envp を使用する場合、無効な情報を取得する可能性があります。

その場合varname、「NULLパラメーターの検証」で説明されているように、この関数は無効なパラメーター ハンドラーを呼び出します。 実行の継続が許可された場合、この関数は errnoEINVAL に設定し、NULL を返します。

ワイド文字を扱う場合は、_wgetenv ではなく getenv を使用します。_wgetenv の場合、引数にはワイド文字列を指定します。また戻り値もワイド文字列です。 _wenviron グローバル変数は _environ と同じですが、ワイド文字を扱えるという点で異なっています。

SBCS ASCII プログラムなどの MBCS プログラムでは、環境がマルチバイト文字列で構成されているため、_wenviron の初期値は NULL です。 その後、_wputenv を最初に呼び出すとき、または (MBCS) 環境が既に存在する場合に _wgetenv を最初に呼び出すとき、対応するワイド文字列環境が作成され、その後は作成されたワイド文字列環境が _wenviron によって参照されます。

同様に、Unicode (_wmain) プログラムでは、環境がワイド文字列で構成されているため、_environ の初期値は NULL です。 その後、_putenv を最初に呼び出すとき、または (Unicode) 環境が既に存在する場合に getenv を最初に呼び出すときは、対応する MBCS 環境が作成され、その後は作成された MBCS 環境が _environ によって参照されます。

環境の 2 つのコピー (MBCS および Unicode) がプログラムに同時に存在する場合、ランタイム システムでは、両方のコピーを保持する必要があるため、実行時間が長くなります。 たとえば、_putenv を呼び出す場合は、2 つの環境文字列が対応するように _wputenv も自動的に呼び出されます。

注意事項

まれに、ランタイム システムで Unicode バージョンとマルチバイト バージョンの両方の環境を保持している場合、これら 2 つの環境バージョンが正確に対応しないことがあります。 これは、一意のマルチバイト文字列はすべて一意の Unicode 文字列に対応していますが、一意の Unicode 文字列は必ずしも一意のマルチバイト文字列に対応していないためです。 詳細については、「 _environ」と「 _wenvironの両方を管理できます。

Note

_putenv 系関数と _getenv 系関数はスレッド セーフではありません。 _getenv が文字列を変更している間に _putenv が文字列ポインターを返すことがあり、これはランダム エラーの原因になります。 これらの関数の呼び出しが同期されていることを確認する必要があります。

既定では、この関数のグローバル状態の適用対象は、アプリケーションになります。 この動作を変更するには、「CRT のグローバル状態」を参照してください

汎用テキスト ルーチンのマップ

TCHAR.H ルーチン _UNICODE_MBCS が定義されていない _MBCS が定義されている _UNICODE が定義されている
_tgetenv getenv getenv _wgetenv

TZ 環境変数の値を確認または変更するには、必要に応じて、getenv_putenv、および _tzset を使用します。 TZ の詳細については、「_tzset」と「_daylighttimezone_tzname」を参照してください。

必要条件

ルーチンによって返される値 必須ヘッダー
getenv <stdlib.h>
_wgetenv <stdlib.h> または <wchar.h>

互換性の詳細については、「 Compatibility」を参照してください。

// crt_getenv.c
// compile with: /W3
// This program uses getenv to retrieve
// the LIB environment variable and then uses
// _putenv to change it to a new value.

#include <stdlib.h>
#include <stdio.h>

int main( void )
{
   char *libvar;

   // Get the value of the LIB environment variable.
   libvar = getenv( "LIB" ); // C4996
   // Note: getenv is deprecated; consider using getenv_s instead

   if( libvar != NULL )
      printf( "Original LIB variable is: %s\n", libvar );

   // Attempt to change path. Note that this only affects the environment
   // variable of the current process. The command processor's
   // environment is not changed.
   _putenv( "LIB=c:\\mylib;c:\\yourlib" ); // C4996
   // Note: _putenv is deprecated; consider using putenv_s instead

   // Get new value.
   libvar = getenv( "LIB" ); // C4996

   if( libvar != NULL )
      printf( "New LIB variable is: %s\n", libvar );
}
Original LIB variable is: C:\progra~1\devstu~1\vc\lib
New LIB variable is: c:\mylib;c:\yourlib

関連項目

プロセスと環境の制御
_putenv, _wputenv
環境定数