在 C 中,如果您想拥有通用容器,一种流行的方法是使用void*
. 如果通用容器包含一些具有自己的释放函数的自定义结构,它可能会要求该函数:
struct Foo {...};
Foo *Foo_Allocate(...);
void Foo_Deallocate(const Foo*);
int main(void)
{
/* Let's assume that when you create the list you have to
specify the deallocator of the type you want to hold */
List *list = List_Allocate(Foo_Deallocate);
/* Here we allocate a new Foo and push it into the list.
The list now has possession of the pointer. */
List_PushBack(list, Foo_Allocate());
/* When we deallocate the list, it will also deallocate all the
items we inserted, using the deallocator specified at the beginning */
List_Deallocate(list);
}
但很可能释放器函数的类型需要一个void*
typedef void (*List_FnItemDeallocator)(const void*);
问题是Foo_Deallocate
需要 a const Foo*
,而不是 a const void*
。即使它们的签名不匹配,传递函数是否仍然安全?可能不是,因为指针类型在 C 中不一定是相同的大小。
如果这不可能,那么让所有释放器函数采用 aconst void*
而不是指向它们相关类型的指针是否是个好主意,以便它们与通用容器兼容?