有没有一种方法来实现用C关闭 [英] Is there a a way to achieve closures in C

查看:124
本文介绍了有没有一种方法来实现用C关闭的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想这个工作,但它不会:

I would like this to work, but it does not:

#include <stdio.h>

typedef struct closure_s {
  void (*incrementer) ();
  void (*emitter) ();
} closure;

closure emit(int in) {

  void incrementer() {
    in++;
  }

  void emitter() {
    printf("%d\n", in);
  }

  return (closure) {
    incrementer,
    emitter
  };
}

main() {
  closure test[] = {
    emit(10),
    emit(20)
  };

  test[0] . incrementer();
  test[1] . incrementer();

  test[0] . emitter();
  test[1] . emitter();
}

实际上确实的编译和做工作,为1个实例...但第二个失败。任何想法如何让闭包用C?

It actually does compile and does work for 1 instance ... but the second one fails. Any idea how to get closures in C?

这将是真正真棒!

推荐答案

使用 FFCALL

#include <callback.h>
#include <stdio.h>
static void incrementer_(int *in) {
    ++*in;
}
static void emitter_(int *in) {
    printf("%d\n", *in);
}
int main() {
    int in1 = 10, in2 = 20;
    int (*incrementer1)() = alloc_callback(&incrememnter_, &in1);
    int (*emitter1)() = alloc_callback(&emitter_, &in1);
    int (*incrementer2)() = alloc_callback(&incrememnter_, &in2);
    int (*emitter2)() = alloc_callback(&emitter_, &in2);
    incrementer1();
    incrementer2();
    emitter1();
    emitter2();
    free_callback(incrementer1);
    free_callback(incrementer2);
    free_callback(emitter1);
    free_callback(emitter2);
}

但通常使用C,你最终传递周围额外的参数,以假倒闭。

But usually in C you end up passing extra arguments around to fake closures.

苹果有一个非标准扩展到C称为,该做的工作就像倒闭。

Apple has a non-standard extension to C called blocks, which do work much like closures.

这篇关于有没有一种方法来实现用C关闭的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆