web-dev-qa-db-ja.com

C ++での環境変数へのアクセス

私が書いているC++プログラムの_$HOME_環境変数にアクセスしたいと思います。 Cでコードを記述している場合は、getenv()関数を使用するだけですが、もっと良い方法があるのではないかと考えていました。ここに私がこれまでに持っているコードがあります:

_std::string get_env_var( std::string const & key ) {                                 
    char * val;                                                                        
    val = getenv( key.c_str() );                                                       
    std::string retval = "";                                                           
    if (val != NULL) {                                                                 
        retval = val;                                                                    
    }                                                                                  
    return retval;                                                                        
}           
_

getenv()を使用してC++の環境変数にアクセスする必要がありますか?少しの知識で回避できる問題に遭遇する可能性はありますか?

63
James Thompson

C++でgetenv()を使用しても問題はありません。 _stdlib.h_で定義されます。または、標準ライブラリの実装を希望する場合は、cstdlibを含めて、_std::_名前空間を介して関数にアクセスできます(つまり、std::getenv() )。これは絶対に悪いことではありません。実際、移植性が心配な場合は、これら2つのバージョンのいずれかをお勧めします。

移植性に関心があるnotであり、マネージC++を使用している場合は、.NETの同等のものを使用できます- System::Environment::GetEnvironmentVariable() 。 Windowsに対応する.NET以外の機能が必要な場合は、単に GetEnvironmentVariable() Win32関数を使用できます。

60
Matt Davis

コードを少しリファクタリングします。

std::string getEnvVar( std::string const & key ) const
{
    char * val = getenv( key.c_str() );
    return val == NULL ? std::string("") : std::string(val);
}
24
Vlad
  • Windowsを使用している場合は、Win32 APIを使用できます GetEnvironmentVariable
  • 他のlinux/unixベースのシステムでは getenv を使用します

WindowsでGetEnvironmentVariableを使用する理由 MSDN getenvから

getenvは、ランタイムライブラリにアクセス可能なデータ構造でのみ動作し、オペレーティングシステムによってプロセス用に作成された環境「セグメント」では動作しません。したがって、mainまたはwmainにenvp引数を使用するプログラムは、無効な情報を取得する場合があります。

そして MSDN GetEnvironmentから

この関数は、システム環境変数またはユーザー環境変数を取得できます。

17
Brian R. Bondy

C++では、std :: getenvおよび#include <cstdlib>を使用する必要があります

10
Mykola Golubyev