ハッシュマップ データ構造の反復子インターフェイスを設計しています。現在のデザインは次のようになります。
// map.h
typedef struct map_iterator map_iterator;
// map.c
struct map_iterator
{
// Implementation details
};
// client.c
map *m = map_new();
map_iterator *it = map_iterator_new(m);
void *key, *value;
while (map_iterator_next(it, &key, &value)) {
// Use key, value
}
map_iterator_free(it);
ただし、これには反復子オブジェクトのヒープ割り当てが必要であり、クライアントは完了時に反復子を解放することを忘れないでください。スタックのイテレータをmap_iterator_new
返すと、コードは次のようになります。
// map.h
typedef struct map_iterator
{
// Implementation details
};
// client.c
map *m = map_new();
map_iterator it = map_iterator_new(m);
void *key, *value;
while (map_iterator_next(&it, &key, &value)) {
// Use key, value
}
ただし、これには、map_iterator
構造体の定義をクライアント コードに提供する必要があります (そうしないと、不完全型エラーが発生します)。この定義を非表示にして、宣言のみを提供したいと思います。
これを達成する方法はありますか?基本的に、クライアント コードに「この構造体は X バイトを使用するため、スタックに割り当てることができますが、そのメンバーにアクセスする方法は教えていません」と伝える方法を探しています。
編集:標準Cのみでお願いします!(コンパイラ拡張/プラットフォーム固有の機能はありません)