Blocks比C++0x中的lambda表达式更强的一点是,它可以是个数组类型:
int main(void)
{
void (^p[2])(void) = { ^(void){ puts("Hello, world!"); }, ^(void){ puts("Goodbye!"); } };
p[0](), p[1]();
}
这里p的类型为void(^[2])(void),表示含有2个void(^)(void)块引用元素的变量。下面谈谈函数块对其外部临时变量的可访问情况。
static int global = 100;
int main(void)
{
int local = 200;
void (^p)(void) = ^(void){ printf("The answer is: %dn", global + local); };
p();
}
对于FP比较熟悉的朋友可能会想到,如果一个外部变量能够随随便便被一个函数块修改的话,那么对于其本身的副作用仍然无法进行方便地多核并行编程。那么我们不妨试试看吧:
static int global = 100;
int main(void)
{
int local = 200;
void (^p)(void) = ^(void){
printf("The answer is: %dn", global + local);
global++;
local--; // compiling error:error: decrement of read-only variable \'local\'
};
p();
printf("After modified, global is: %d and local is %dn", global, local);
}
对于全局变量可以进行修改,但是对于main函数中的局部变量则不行。如果对local修改则无法通过编译。很显然,Blocks对此已经有了相应的机制。 那么我们如何能够对local进行修改呢?
static int global = 100;
int main(void)
{
__block int local = 200;
static int s = 10;
void (^p)(void) = ^(void){
printf("The answer is: %dn", global + local);
global++;
s++;
local--;
};
p();
printf("After modified, global is: %d and local is %d and s is: %dn", global, local, s);
}
这里引入了一个新的关键字 ——__block,用此声明一个局部变量可以被函数块修改。
|
|