C ++将const分配给环境变量或默认值

时间:2010-10-14 18:14:52

标签: c++ variables const environment getenv

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

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

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

有什么想法吗?

3 个答案:

答案 0 :(得分:8)

怎么样:

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");

答案 1 :(得分:0)

James McNellis提供了great answer,但这里有另一种意见:

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

只是一个想法。

答案 2 :(得分:0)

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

if ( configuration.ExitOnFailure && IsError() )
   exit();