해시 맵 데이터 구조의 반복기 인터페이스를 설계하고 있습니다. 현재의 디자인은 다음과 같습니다정의가없는 불투명 한 구조체
// 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, 제발! (컴파일러 확장/플 '폼 특정 기능 없음)
이터레이터의 '구현 세부 사항'은 무엇입니까? – 2501
@ 2501 반복자 상태, 예 : hashmap에 대한 포인터, 현재 버킷 인덱스, 수정 횟수 등 –
이터레이터에 대한 포인터를 제공하지 않고 나중에 해방하는 것이 문제입니다. 컬 (curl) 등과 같은 많은 라이브러리도 이러한 인터페이스를 제공합니다. 차라리 첫 번째 옵션을 두 번째 옵션보다 사용하고 싶습니다. – ckruczek