我想管理具有相同"通用"功能的各种实体。这些实体示意性地声明为:
typedef struct {
prefix_t pfx;
int i1;
int i2;
int i3;
} entity_t;
即用于内务处理的 typedef'd 结构前缀(包含链接指针、标志等(和有效负载。每个实体类型都有一个这样的类型声明。
内务管理函数只需要获取指向前缀的指针,这很容易,并且函数将"探索"有效负载以返回有意义的内务管理数量。
以二叉树管理为例:
void TreeInsert (prefix_t *a, prefix_t *b, int (*compare) (prefix_t *, prefix_t *));
在程序内部,我有一个这样的电话:
if (0 > compare(a, b)) {
// a comes before b
} else {
// a is the same as b or comes after
};
没关系。库函数编译时没有错误也没有警告。
但很明显,比较函数不能只引用前缀。它需要探测有效载荷才有用:
int comp_entity (entity_t *a, entity_t *b) {
return a->i1 - b->i1;
}
编译器在以下行中发出comp_entity警告:
TreeInsert (&a->pfx, &b->pfx, comp_entity);
由于库函数用于许多不同的"实体",因此在调用时无法对比较函数进行类型转换。不能为前缀键入比较函数的参数,否则无法访问有效负载。
我是否应该定义一个特定的函数类型,以便将比较传递给库函数?像这样:
typedef int (func_cast *) (prefix_t *, prefix_t*);
和
TreeInsert (&a->pfx, &b->pfx, (func_cast)comp_entity);
我宁愿避免这种情况。这可能吗?
诺塔:
我发现创建通用函数指针指向任何类型 C 语言和 我如何使 C 编译器安静关于函数指针需要任意数量的参数?,但它们不提供解决方案。
你的比较函数知道真正的类型应该是什么,所以你可以用类型prefix_t *
声明参数,并在函数内部强制转换参数:
int comp_entity (prefix_t *a, prefix_t *b) {
entity_t *ea = (entity_t *)a;
entity_t *eb = (entity_t *)b;
return ea->i1 - eb->i1;
}