对于使用多个环境变量的应用程序,在抓取环境变量并将它们放入结构或一堆的情况下,是否存在某种惯例或“最佳实践” 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");

其他提示

詹姆斯·麦克内利斯(James McNellis) 提供了 很棒的答案, ,但这是一个替代意见:

我认为 getenv() 在程序启动时返回环境变量的值。如果环境变量在启动程序后更改, getenv() 仍然会返回旧值。基于此,另一种方法可能是要有一个类来捕获所有必需的环境变量作为属性。该类是在程序开始时填充的,仅提供(constemifified)访问者方法。这样 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