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");
他のヒント
ジェームズ・マクネリス を提供しました 素晴らしい答え, 、しかし、ここに別の意見があります:
おもう 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");
ちょっとした考え。
私は通常、構成設定をロードするクラス(環境または構成ファイルから)でこれを行います。スタートアップで単一のグローバルインスタンスをインスタンスにします。プログラム設定は、Configurationクラスオブジェクトのメソッドまたはプロパティです。それは簡単で、コードを書くとき、それはあなたが意図したことをかなり明確です:
if ( configuration.ExitOnFailure && IsError() )
exit();