4

CURRENT_DIRは自分のプログラムで何度も電話をかけます(以下を参照)。プログラムの実行中に実行可能パスが変更されないように、この関数を呼び出すたびに実行可能パスを再度定義しても意味がありません。

したがって、この値が一度設定されると、再度設定されるべきではないという解決策を探しています。

私の現在の解決策は次のとおりです。すべての値を0に設定して静的変数を作成し、ifステートメントテストで最初の文字がnullでないかどうかを確認し、trueの場合は設定します。しかし、それはエレガントではないように見えます..多分より良い解決策があるかもしれません..マクロを含むいくつかのモデルを使用することによって、私は知りません。

コードを参照してください:

#define CURRENT_DIR ({                                          \
  static char buffer[MAX_PATH + 1] = { 0 };         \
      if(buffer[0] != '\0')                     \
    getcurrentdir(buffer, MAX_PATH);            \
      buffer;                           \
})
4

1 に答える 1

6

gcc固有の式ステートメントの代わりに、関数を使用します(inline必要に応じてdを使用することもできます)。

const char* currentDir(void)
{
    static char buffer[MAX_PATH + 1] = { 0 };
    if (buffer[0] == '\0')
    {
        getcurrentdir(buffer, MAX_PATH);
    }
    return buffer;
}

これにはいくつかの利点があります。

  • それはよりポータブルです。(もちろん、プラットフォームMAX_PATHgetcurrentdir依存します。)
  • 型安全性が優れています。文字列が一定であることを意図している場合は、クライアントが誤って文字列を変更することを許可したくありません。

(gcc式ステートメントの実装はとにかく壊れています。変数は同じスコープ内のstatic複数のサイトで再利用されることはなく、テストは逆方向であるため、空でない文字列に初期化されることはありません。)CURRENT_DIRifbuffer

于 2012-07-14T05:49:57.460 に答える