1
2
1
3
1
4
return 0;
}
会产生对应的 3 个函数:
1
2
3
__maxBlk_block_func_0
__main_block_func_0
__main_block_func_1
可见函数的命名规则为:__
{$Scope}
_block_func_
{$index}
。其中{$Scope}为
block 所在函数,如果{$Scope}为全局就取 block 本身的名称;{$index}表示该
block 在{$Scope}作用域内出现的顺序(第几个 block)。
1. 从语法上看如何捕获外部变量
“
在上面的代码中,已经看到
匿名函数
”可以直接访问外围作用域的变量 i:
1
2
3
int i = 1024;
void (^blk)(void) = ^{ printf("%d\n", i); };
blk();
当匿名函数和 non-local 变量结合起来,就形成了闭包(个人看法)。
这一段代码可以成功输出 i 的值。
我们把一样的逻辑搬到 C++上:
1
2
3
int i = 1024;
auto func = [] { printf("%d\n", i); };
func();
GCC 会输出:
错误
‘
: i’未被捕获
。可见在 C++中无法直接捕获外围作用域的变量。
以 BNF 来表示 Lambda 表达式的上下文无关文法,存在:
1
lambda-expression : lambda-introducer lambda-parameter-declarationopt
compound-statement