11

nftw を使用して、C のディレクトリ構造をトラバースしたいと考えています。

ただし、私がやりたいことを考えると、グローバル変数を使用する方法がわかりません。

(n)ftw を使用する教科書の例はすべて、ファイル名を出力するようなことを伴います。代わりに、パス名とファイルのチェックサムを取得して、それらをデータ構造に配置したいと考えています。しかし、nftw に渡すことができるものに制限があるため、これを行う良い方法がわかりません。

私が使用しているソリューションには、グローバル変数が含まれています。nftw によって呼び出される関数は、その変数にアクセスして、必要なデータを追加できます。

グローバル変数を使用せずにこれを行う合理的な方法はありますか?

これは、フォローアップとしてこれを投稿することを誰かが提案した、stackoverflow に関する以前の投稿の交換です。

4

3 に答える 3

3

関数nftwに渡すことができるユーザー パラメーターは提供されないため、C ではグローバル (または静的) 変数を使用する必要があります。

GCC は、囲んでいるスコープの変数をキャプチャする拡張「ネストされた関数」を提供するため、次のように使用できます。

void f()
{
  int i = 0;
  int fn(const char *,
    const struct stat *, int, struct FTW *) {
    i++;
    return 0;
  };
  nftw("path", fn, 10, 0);
}
于 2012-04-23T13:26:02.713 に答える
2

に渡される関数を含め、データへのアクセスに必要な関数のみを含む別のモジュールで、データに静的リンケージ (つまり、ファイル スコープ) を指定するのが最適ですnftw()。そうすれば、データはグローバルに表示されず、すべてのアクセスが制御されます。ntfw() を呼び出す関数もこのモジュールの一部であり、nftw() に渡される関数を静的にすることができるため、外部からは見えない可能性があります。

言い換えれば、おそらくすでに行っていることを行う必要がありますが、別のコンパイルと静的リンケージを慎重に使用して、アクセス関数を介してのみデータを表示できるようにする必要があります。静的リンケージを持つデータは、同じ翻訳単位内の任意の関数からアクセスできます。そのデータの作成者、維持者、またはアクセサーである関数のみをその翻訳単位に含めることで、グローバル変数に関連する問題を回避できます。

一般的なパターンは次のとおりです。

datamodule.h

#if defined DATAMODULE_INCLUDE
<type> create_data( <args>) ;
<type> get_data( <args> ) ;
#endif

datamodule.c

#include "datamodule.h"

static <type> my_data ;

static int nftwfunc(const char *filename, const struct stat *statptr, int fileflags, struct FTW *pfwt)
{
    // update/add to my_data
    ...
}


<type> create_data( const char* path, <other args>)
{
    ...

    ret = nftw( path, nftwfunc, fd_limit, flags);

    ... 
}

<type> get_data( <args> )
{
    // Get requested data from my_data and return it to caller
}
于 2012-04-23T13:40:52.057 に答える