0

const对于使用多个环境变量的应用程序,在获取环境变量并将它们放入结构体或一堆's时是否有某种约定或“最佳实践” ?显然,我想回退到每个环境变量的默认值。现在,使用以下方法似乎是一种非常混乱的方式:

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

如果环境变量为空,我还可以编写一个包装getenv以返回默认值的函数,但我不确定这是否是最好的方法。我也可以取消 using const,但这似乎也不是一件好事。

有什么想法吗?

4

3 回答 3

10

怎么样:

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");
于 2010-10-14T18:21:08.927 回答
0

James McNellis提供了一个很好的答案,但这里有另一种意见:

我认为getenv()返回程序启动时环境变量的值。如果程序启动后环境变量发生变化,getenv()仍会返回旧值。基于此,另一种方法可能是使用一个类来捕获所有必需的环境变量作为属性。该类在程序开始时填充,并且仅提供(const-qualified)访问器方法。这样,每个环境变量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");

只是一个想法。

于 2010-10-14T19:56:22.860 回答
0

我通常使用加载配置设置(从环境或配置文件)的类来执行此操作。我在启动时实例化它的一个全局实例。程序设置是配置类对象的方法或属性。这很简单,当您编写代码时,您的意图非常清楚:

if ( configuration.ExitOnFailure && IsError() )
   exit();
于 2010-10-14T20:01:04.590 回答