C ++ присваивает const переменной окружения или значению по умолчанию - PullRequest
0 голосов
/ 14 октября 2010

Для приложения, которое использует несколько переменных среды, существует ли какое-то соглашение или «наилучшая практика», когда дело доходит до захвата переменных среды и помещения их либо в структуру, либо в набор const?Очевидно, я хочу вернуться к значению по умолчанию для каждой переменной среды.Прямо сейчас, использование следующего выглядит как очень грязный способ сделать это:

char* x;
const SOME_VARIABLE;
if (NULL == (x = getenv("SOME_VARIABLE")))
    SOME_VARIABLE = 5; // default value
else
    SOME_VARIABLE = x;

Я мог бы также написать функцию, которая переносит getenv, чтобы возвращать значение по умолчанию, если переменная окружения пуста, но яЯ не уверен, что это даже лучший способ сделать это.Я также мог бы покончить с использованием const, но это тоже не очень хорошая вещь.

Есть мысли?

Ответы [ 3 ]

8 голосов
/ 14 октября 2010

Как насчет:

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");
0 голосов
/ 15 октября 2010

Я обычно делаю это с классом, который загружает параметры конфигурации (из среды или из файла конфигурации) Я запускаю один глобальный экземпляр этого при запуске. Настройки программы - это метод или свойство объекта класса конфигурации. Это просто, и когда вы пишете код, становится совершенно ясно, что вы намеревались:

if ( configuration.ExitOnFailure && IsError() )
   exit();
0 голосов
/ 14 октября 2010

Джеймс МакНеллис предоставил отличный ответ , но вот альтернативное мнение:

Я думаю, 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");

Просто мысль.

...