C ++ Назначить const для переменной окружающей среды или значение по умолчанию

StackOverflow https://stackoverflow.com/questions/3936212

Вопрос

Для приложения, использующего ряд переменных окружающей среды, есть ли какая-то конвенция или «наилучшая практика», когда речь идет о том, когда речь идет о том, чтобы схватить переменные среды и положить их в структуру, либо в группе или кучу 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();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top