如何在 C 中创建通用库函数?



我想管理具有相同"通用"功能的各种实体。这些实体示意性地声明为:

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;
}

相关内容

  • 没有找到相关文章

最新更新