C ++ Назначить const для переменной окружающей среды или значение по умолчанию
-
30-09-2019 - |
Вопрос
Для приложения, использующего ряд переменных окружающей среды, есть ли какая-то конвенция или «наилучшая практика», когда речь идет о том, когда речь идет о том, чтобы схватить переменные среды и положить их в структуру, либо в группе или кучу const
? Очевидно, я хочу отбросить значение по умолчанию для каждой и каждой переменной окружающей среды. Прямо сейчас, используя следующее, похоже на очень грязный способ сделать это:
char* x;
const SOME_VARIABLE;
if (NULL == (x = getenv("SOME_VARIABLE")))
SOME_VARIABLE = 5; // default value
else
SOME_VARIABLE = x;
Я мог бы также написать функцию, которая оборачивается getenv
Чтобы вернуть значение по умолчанию, если переменная среды пуста, но я не уверен, что это даже лучший способ сделать это. Я также мог покончить с использованием const
, но это тоже не похоже на хорошую вещь.
Есть предположения?
Решение
Как насчет:
std::string GetEnvironmentVariableOrDefault(const std::string& variable_name,
const std::string& default_value)
{
const char* value = getenv(variable_name.c_str());
return value ? value : default_value;
}
Используется в качестве:
const std::string some_variable = GetEnvironmentVariableOrDefault("SOME_VARIABLE", "5");
Другие советы
Джеймс Макнеллис предоставил А. отличный ответ, но вот альтернативное мнение:
я думаю getenv()
Возвращает значение переменной среды в момент начала программы. Если переменная среды изменяется после начала программы, getenv()
все равно вернет старое значение. На основании этого альтернативный подход может иметь класс для захвата всех необходимых переменных среды в качестве атрибутов. Класс заполнен в начале программы, а также предоставляет только (квалифицированные констоте) методы доступа. Таким образом getenv()
называется ровно один раз Для каждой переменной окружающей среды. На негативной стороне класс занимает некоторое пространство.
В альтернативном подходе, который не использует никакого места, getenv()
вызывается всякий раз, когда требуется значение любой переменной окружающей среды. Это не то, что getenv()
Звонок стоит дорого (на самом деле я не знаю), но он несет ложное предположение для программиста того, что новейшее значение может быть возвращено.
Также в классе может быть полезен для абстрактных, если есть какая-либо зависимость в использовании переменных окружающей среды, например,
if $OS = "SunOs"
then
GCC="/bin/gcc"
else
GCC="/usr/bin/gcc"
(this is just an example though)
Теперь функция, которая не заботится о $OS
Но нужно только $GCC
, может просто обратиться к envClass->get("GCC");
Просто мысль.
Я обычно делаю это с классом, который загружает настройки конфигурации (либо из среды, либо файла конфигурации). Я создал единый глобальный экземпляр этого при запуске. Настройки программы являются способ или свойство объекта класса конфигурации. Это просто и когда вы пишете код, это довольно ясно, что вы предполагали:
if ( configuration.ExitOnFailure && IsError() )
exit();