加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何删除此(不可移植)嵌套函数?

发布时间: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的那个.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读