に渡される関数を含め、データへのアクセスに必要な関数のみを含む別のモジュールで、データに静的リンケージ (つまり、ファイル スコープ) を指定するのが最適です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
}