C ++分配const到环境变量或默认值
-
30-09-2019 - |
题
对于使用多个环境变量的应用程序,在抓取环境变量并将它们放入结构或一堆的情况下,是否存在某种惯例或“最佳实践” 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();
不隶属于 StackOverflow