对于使用多个环境变量的应用程序,在获取环境变量并将它们放入结构或一堆const
时,是否存在某种约定或“最佳实践”? S'显然,我想回退到每个环境变量的默认值。现在,使用以下内容似乎是一种非常混乱的方式:
char* x;
const SOME_VARIABLE;
if (NULL == (x = getenv("SOME_VARIABLE")))
SOME_VARIABLE = 5; // default value
else
SOME_VARIABLE = x;
如果环境变量为空,我还可以编写一个函数来包装getenv
以返回默认值,但我不确定这是否是最好的方法。我也可以放弃使用const
,但这似乎也不是一件好事。
有什么想法吗?
答案 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();