background image

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