我正在爲我的hashmap數據結構設計一個迭代器接口。目前的設計是這樣的:不定義的不透明結構
// 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);
然而,這需要iterator對象堆分配,並在客戶端必須記住釋放迭代他們完成時。如果我讓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! (沒有編譯器擴展/特定於平臺的功能)
迭代器中的「實現細節」下面是什麼? – 2501
@ 2501迭代器狀態,例如指向hashmap,當前存儲分區索引,修改計數等。 –
我不認爲提供一個指向你的迭代器的指針,然後釋放它是一個問題。許多庫,如curl等也提供了這樣的接口。我寧願使用第一個選項而不使用第二個選項。 – ckruczek