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