如何删除此(不可移植)嵌套函数?
发布时间:2020-12-16 07:08:40 所属栏目:百科 来源:网络整理
导读:我有一个函数,可以对结构的指针列表进行排序(省略了实现): void sort_by(struct thing **start,int size,int (*cmp_by)(struct thing *,struct thing *)); 这个函数允许我传入一个比较函数cmp_by,它接受两个结构,并根据需要返回1,-1.然后存在这个(仅限GCC!
我有一个函数,可以对结构的指针列表进行排序(省略了实现):
void sort_by(struct thing **start,int size,int (*cmp_by)(struct thing *,struct thing *)); 这个函数允许我传入一个比较函数cmp_by,它接受两个结构,并根据需要返回1,-1.然后存在这个(仅限GCC!)函数: void reverse_by(struct thing **start,struct thing *)) { int cmp_reverse(struct thing *a,struct thing *b) { return -cmp_by(a,b); } sort_by(start,size,cmp_reverse); } 此函数采用与sort_by相同的参数,但通过翻转比较结果的符号来反转排序顺序. GCC具有此扩展以允许嵌套函数.应该如何写出reverse_by?即使我尝试将其付诸实践,也无法进行编译: int (*reverse(int (*fn)(struct thing *,struct thing *)))(struct thing *,struct thing *) { return -fn; /* OBVIOUSLY AND CONCEPTUALLY WRONG */ } int (*reverse(int (*fn)(struct thing *a,struct thing *b)))(struct thing *x,struct thing *y) { return -fn(a,b); /* WRONG RETURN TYPE WRONG WRONG */ } int (*reverse(int (*fn)(struct thing *a,struct thing *y) { return -fn(x,y); /* YOU HAVE NO IDEA WHAT YOU'RE DOING STOP GUESSING */ } 如果没有添加大量额外的结构部件或重写代码行调用reverse_by(或将sort_by代码复制粘贴到其中),如何重写以消除嵌套函数?最好避免复制/粘贴作为解决方案,因为此代码库在其他地方涉及此嵌套函数模式. 解决方法
可重入但不是线程安全的解决方案:
typedef int (*cmp_func)(struct thing *,struct thing *); static cmp_func reverse_cmp_by_impl; static int cmp_reverse(struct thing *a,struct thing *b) { int ret; cmp_func impl = reverse_cmp_by_impl; ret = -impl(a,b); reverse_cmp_by_impl = impl; // For re-entrancy return ret; } void reverse_by(struct thing **start,cmp_func cmp_by) { reverse_cmp_by_impl = cmp_by; sort_by(start,cmp_reverse); } 请注意,这是假设sort_by的理智实现.即,除了可能通过比较功能之外,不以任何方式调用reverse_by的那个. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |