関数内で静的変数が初期化されるタイミング

解決


ayumi  2010-01-12 11:25:30  No: 71237  IP: [192.*.*.*]

下記のtestという関数は、
環境変数TESTの値がONかどうかを判定する関数です。

この関数を別の関数から呼び出すときに、
static env は 最初に呼び出された一回だけ初期化されるため、
getenvは何度も呼び出されないと思っています。

この認識は正しいでしょうか?

bool test()
{
  static bool env = ((stricmp( getenv( "TEST" ), "ON" ) == 0) ? true : false);
  return env;
}

宜しくお願いいたします。

編集 削除
tetrapod  2010-01-12 12:11:15  No: 71238  IP: [192.*.*.*]

> この認識は正しいでしょうか?
Yes.

でも他のバグがあるのでこのコードはお勧めできない、かな・・・

編集 削除
ayumi  2010-01-12 13:03:36  No: 71239  IP: [192.*.*.*]

tetrapod様、ご回答ありがとうございます。

このコードに含まれているバグとは何なのでしょうか?
また、お勧めのコードをお教えいただけますでしょうか?

宜しくお願いいたします。

編集 削除
tetrapod  2010-01-12 13:23:53  No: 71240  IP: [192.*.*.*]

getenv は env がないとき NULL を返すから、今のままではまずい。
どう直すとよいかは、どう動いて欲しいかで異なるので一概に言えない。

そもそも当該プログラム中で putenv したら自己の環境変数の更新ができるわけなので、
最初に1回だけ getenv するのが「仕様として良い」かどうかも要再検討。

編集 削除
ayumi  2010-01-12 13:31:24  No: 71241  IP: [192.*.*.*]

tetrapod様、指摘して頂いた点を再検討してみます。
ご回答有難うございました。

編集 削除