C块范围功能?

时间:2012-07-25 05:55:43

标签: c

是否可以创建一个适用于块范围的函数?如

编辑澄清

enum { cannot, must };
int it(enum modal verb);

describe(fx) {
    context("some context") {
        it(must) { /* Some test that returns an int to it() */ };
    }
}

我怀疑这是可能的,那么我能做的最好的事情是什么呢?

2 个答案:

答案 0 :(得分:6)

这看起来像Smalltalk或Ruby,这让我觉得你想把闭包(有时称为 blocks )传递给函数。这可以通过C的各种扩展来实现,也有解决方法。

例如,您可能希望遍历列表:

{
    // this does not actually work, sorry
    iterate(list) { |i| -> printf("%d\n", i); }
}

如果您使用Apple的C扩展,您可以使用名为“blocks”的内容

{
    // Apple only
    iterate(list, ^(int i) { printf("%d\n", i); });
}

你也可以写一个回调,

static void my_callback(int i) { printf("%d\n", i); }

...
{
    iterate(list, my_callback);
}

回调无法访问其他函数中的变量,因此您必须找到一种共享变量的方法。

GCC中有嵌套函数;这些可以像Apple的“块”扩展一样访问范围变量。

{
    // GCC only
    void callback(int i) { printf "%d\n", i); }
    iterate(list, callback);
}

如果你发现自己想要做很多事情,你可以通过切换到C语言以外的语言来省去很多头痛。对于高阶编程来说,C语言不是很友好。

答案 1 :(得分:0)

我不确定你想要什么,但也许GCC的nested function扩展可以满足你的需求。请注意,它是非标准扩展(并且其他一些编译器不提供它)。

请注意C函数(遗憾地)不是closures;这是切换到某种功能语言的原因(如Ocaml,Haskell,Scheme ...)。