clang の拡張機能 block を用いると無名関数が書けるのですね。Apple による拡張だそうです。
下記で、関数 call1() の第1引数は関数へのポインタを取り、関数 call2() の第1引数は block を取ります。前置演算子「^」が絶妙な働きをしています。このように名前のない block を使うと、ラムダ式のように利用することができます。前置演算子「^」はよく見ると大文字のラムダ「Λ」に似ています(小文字ラムダ「λ」にも少し似てます)。
#include <stdio.h> static void call1(int a, int b, void(*func)(int, int)) { (*func)(a, b); } static void call2(int a, int b, void(^func)(int, int)) { func(a, b); } static void calc1(int a, int b) { printf("%d * %d = %d\n", a, b, a * b); } int main(int argc, char **argv) { /* Print: 7 * 2 = 14 */ call1(7, 2, calc1); /* Print: 5 ^ 3 = 6 */ call2(5, 3, ^(int a, int b){ printf("%d ^ %d = %d\n", a, b, a ^ b); }); /* Print: 3 ^ 4 = 7 */ ^(int a, int b){ printf("%d ^ %d = %d\n", a, b, a ^ b); }(3, 4); return 0; }
次のように出力されます。
7 * 2 = 14 5 ^ 3 = 6 3 ^ 4 = 7
《参考文献》
- Language Specification for Blocks (Clang 8 documentation)
- Blocks (C language extension) (Wikipedia)
- Anonymous function (Wikipedia)