这个问题并不十分具体; 这真的是我自己的C浓缩,我希望其他人也能发现它有用.
免责声明:我知道很多人会有回应的冲动"如果你试图做FP然后只使用一种功能语言".我在一个需要链接到许多其他C库的嵌入式环境中工作,并且没有太多空间用于更多大型共享库,并且不支持许多语言运行时.而且,动态内存分配是不可能的.我也很好奇.
我们中的许多人已经看到了lambda表达式的这个漂亮的C宏:
#define lambda(return_type, function_body) \
({ \
return_type __fn__ function_body \
__fn__; \
})
Run Code Online (Sandbox Code Playgroud)
一个示例用法是:
int (*max)(int, int) = lambda (int, (int x, int y) { return x > y ? x : y; });
max(4, 5); // Example
Run Code Online (Sandbox Code Playgroud)
使用gcc -std=c89 -E test.c,lambda扩展为:
int (*max)(int, int) = ({ int __fn__ (int x, int y) { return x > y ? x : y; } __fn__; });
Run Code Online (Sandbox Code Playgroud)
所以,这些是我的问题:
线int(*X)究竟是什么?宣布?当然,int*X; 是指向整数的指针,但这两者有何不同?
看一下这个扩大的宏观,最终会__fn__做什么呢?如果我写一个测试函数 …
我最近发现gcc允许定义嵌套函数.在我看来,这是一个很酷的功能,但我想知道如何实现它.
虽然通过将上下文指针作为隐藏参数传递来实现嵌套函数的直接调用当然不难,但gcc还允许获取指向嵌套函数的指针并将此指针传递给任意其他函数,而该函数又可以调用嵌套函数上下文的功能.因为调用嵌套函数的函数只有要调用的嵌套函数的类型,所以它显然无法传递上下文指针.
我知道,其他语言如Haskell有一个更复杂的调用约定允许部分应用程序支持这些东西,但我认为没有办法在C中这样做.如何实现这一点?
以下是一个说明问题的案例的小例子:
int foo(int x,int(*f)(int,int(*)(void))) {
int counter = 0;
int g(void) { return counter++; }
return f(x,g);
}
Run Code Online (Sandbox Code Playgroud)
此函数调用一个函数,该函数调用一个函数,该函数从上下文返回一个计数器并同时递增它.
Clang有一个非常酷的扩展名为block,它将真正的lambda函数机制引入C语言.与block相比,gcc的嵌套函数非常有限.但是,尝试编译一个简单的程序c.c:
#include <stdio.h>
int main() {
void (^hello)(void) = ^(void) {
printf("Hello, block!\n");
};
hello();
return 0;
}
有clang -fblocks c.c,我得到了
/usr/bin/ld.gold: /tmp/cc-NZ7tqa.o: in function __block_literal_global:c.c(.rodata+0x10): error: undefined reference to '_NSConcreteGlobalBlock' clang: error: linker command failed with exit code 1 (use -v to see invocation)
似乎我应该使用clang -fblocks c.c -lBlocksRuntime,但后来我得到了
/usr/bin/ld.gold: error: cannot find -lBlocksRuntime (the rest is the same as above)
任何提示?