Подтвердить что ты не робот

Доступ к переменным среды в С++

Я хотел бы иметь доступ к переменной среды $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() для доступа к переменным среды на С++? Есть ли проблемы, с которыми я, вероятно, столкнусь, что я могу избежать с небольшим количеством знаний?

4b9b3361

Ответ 1

Нет ничего плохого в использовании getenv() в С++. Он определяется stdlib.h, или если вы предпочитаете стандартную реализацию библиотеки, вы можете включить cstdlib и получить доступ к функции через пространство имен std:: (т.е. std::getenv()). Абсолютно ничего плохого в этом. На самом деле, если вы обеспокоены переносимостью, предпочтительна любая из этих двух версий.

Если вы не обеспокоены переносимостью и используете управляемый С++, вы можете использовать эквивалент .NET - System::Environment::GetEnvironmentVariable(). Если вы хотите эквивалент не .NET для Windows, вы можете просто использовать функцию GetEnvironmentVariable() Win32.

Ответ 2

Я бы немного переформатировал код:

std::string getEnvVar( std::string const & key ) const
{
    char * val = getenv( key.c_str() );
    return val == NULL ? std::string("") : std::string(val);
}

Ответ 3

  • Если вы находитесь в Windows, вы можете использовать API Win32 GetEnvironmentVariable
  • В других системах на основе linux/unix используйте getenv

Зачем использовать GetEnvironmentVariable в Windows, из MSDN getenv:

getenv работает только с данными структуры, доступные для времени выполнения библиотеки, а не окружающей среды "сегмент", созданный для операционной системы. Следовательно, программы, которые используют аргумент envp для main или wmain могут получить недопустимые информация.

И из MSDN GetEnvironment:

Эта функция может извлекать либо системная переменная среды или пользователь переменная среды.

Ответ 4

В С++ вы должны использовать std:: getenv и #include <cstdlib>