这个问题并不是很具体;这确实是为了丰富我自己的 C 语言,我希望其他人也能发现它很有用。
免责声明:我知道很多人都会有这样的冲动:“如果你想尝试函数式编程,那么就使用函数式语言”。我在需要链接到许多其他 C 库的嵌入式环境中工作,并且没有太多空间用于许多大型共享库,并且不支持许多语言运行时。而且,动态内存分配是不可能的。我也很好奇。
我们中的许多人都见过这个漂亮的 lambda 表达式 C 宏:
#define lambda(return_type, function_body) \
({ \
return_type __fn__ function_body \
__fn__; \
})
一个示例用法是:
int (*max)(int, int) = lambda (int, (int x, int y) { return x > y ? x : y; });
max(4, 5); // Example
Using gcc -std=c89 -E test.c
,lambda 展开为:
int (*max)(int, int) = ({ int __fn__ (int x, int y) { return x > y ? x : y; } __fn__; });
所以,这些是我的问题:
该行到底是什么整数(*X);宣布?当然,int * X;是一个指向整数的指针,但这两者有何不同?
看看展开的宏,最后的结果到底是做什么的?__fn__
做?如果我写一个测试函数void test() { printf("hello"); } test;
- 这会立即引发错误。我不明白那个语法。
这对于调试意味着什么? (我打算用这个和 gdb 自己进行实验,但其他人的经验或意见会很棒)。这会搞砸静态分析仪吗?
该声明(在块范围内):
int (*max)(int, int) =
({
int __fn__ (int x, int y) { return x > y ? x : y; }
__fn__;
});
不是 C,但是有效的 GNU C。
它利用了两个gcc
扩展名:
- 嵌套函数 http://gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html
- 语句表达式 http://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html
Both 嵌套函数(在复合语句中定义函数)和语句表达式 (({})
,基本上是一个产生值的块)在 C 中是不允许的,并且来自 GNU C。
在语句表达式中,最后一个表达式语句是构造的值。这就是为什么嵌套函数__fn__
作为表达式语句出现在语句表达式的末尾。功能指示符 (__fn__
表达式中的最后一个表达式语句中)通过通常的转换转换为指向函数的指针。这是用于初始化函数指针的值max
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)