【问题标题】:C++ assign const to environment variable or default valueC++ 将 const 分配给环境变量或默认值
【发布时间】:2010-10-14 18:14:51
【问题描述】:

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

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

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

有什么想法吗?

【问题讨论】:

  • 顺便说一句,在 C++ 中将任何变量或常量命名为全部大写并不是一个好主意,因为按照惯例,预处理器使用所有大写名称,并且预处理器宏可以轻松地破坏您的变量。跨度>
  • 啊,谢谢你的提示。我的印象是常量通常应该全部大写。
  • @Dav,你可能从所有常量都是宏的代码中学到了这种风格(#define SOME_VARIABLE 5)。它们是大写的,因为它们是宏,而不是因为它们是常量。
  • @dav 我见过的一个约定是在每个常量变量名前加上“k”,如kSomeVariable
  • 啊,是的; K 代表康斯坦特。等等……

标签: c++ variables constants environment getenv


【解决方案1】:

怎么样:

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

【讨论】:

  • 似乎是最简单的解决方案。谢谢。
  • 我建议也可以将函数名重载到 getenv(),这样读起来会更自然。然而风险在于人们会在 getenv 文档/头文件中寻找它,并且可能会错过它的本地函数。
【解决方案2】:

James McNellis 提供了一个great answer,但这里有一个替代意见:

我认为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");

只是一个想法。

【讨论】:

  • 好点,虽然我不打算在太多的地方使用这些常量,所以我可能不必调用getenv太多次。一个这样的类在 IMO 上似乎有点矫枉过正,因为这实际上只是在复制 getenv 已经做的事情。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 2021-02-26
    相关资源
    最近更新 更多