不透明的结构没有定义

And*_*Sun 5 c encapsulation opaque-pointers

我正在为我的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);
Run Code Online (Sandbox Code Playgroud)

但是,这需要为迭代器对象分配堆,并且客户端必须记住在迭代器完成时释放迭代器.如果我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
}
Run Code Online (Sandbox Code Playgroud)

但是,这要求我将map_iterator结构的定义提供给客户端代码(否则我会得到不完整的类型错误).我想隐藏这个定义并仅提供声明.

有没有办法实现这个目标?本质上,我正在寻找一种方法来告诉客户端代码"这个结构占用了X个字节,因此你可以在堆栈上分配它,但我不会告诉你如何访问它的成员".

编辑:仅限标准C,请!(没有编译器扩展/特定于平台的功能)

not*_*row -2

有一个名为alloca的函数,它在调用者的堆栈上保留内存。所以你的代码可能看起来像:

// map.h
typedef struct map_iterator map_iterator;
extern int map_iterator_size;
// map.c
struct map_iterator
{
    // Implementation details
};
int map_iterator_size = sizeof(struct map_iterator);
// client.c
map *m = map_new();
map_iterator *it = alloca(map_iterator_size);
map_iterator_new(m, it);
void *key, *value;
while (map_iterator_next(it, &key, &value)) {
    // Use key, value
}
Run Code Online (Sandbox Code Playgroud)

  • 我没有看到 `alloca()` 和将对象直接放在堆栈上之间有任何区别(从堆栈损坏的角度来看)。`sizeof` 是在具有完整定义的地方计算的。 (2认同)