接著上一篇
接下來,添加一下參數(shù)看看
int main(){
int dmy = 256;
int val = 10;
const char *fmt = "val = %d\n";
void (^blk)(void) = ^{
printf(fmt,val);
};
val = 2;
fmt = "These value were changed. val = %d\n";
blk();
return 0;
}
通過之前的clang命令編譯一下,得到以下的代碼

屏幕快照 2017-08-25 下午10.20.03.png
首先看一下相同的部分,從上面可以看出來__main_block_desc_0和__block_impl是相同,然后看一下不同的地方__main_block_impl_0的聲明以及初始化;
聲明部分可以看到,之前使用的自動(dòng)變量通過block語法作為成員變量追加到__main_block_impl_0結(jié)構(gòu)體中,__main_block_impl_0結(jié)構(gòu)體的成員變量類型的聲明與自動(dòng)變量的類型完全相同。注意,Block語法表達(dá)式中沒有用到的自動(dòng)變量不會(huì)被追加。
下面是初始化該結(jié)構(gòu)體實(shí)例的構(gòu)造函數(shù)的差異:
__main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, const char *_fmt, int _val, int flags=0) : fmt(_fmt), val(_val)
在初始化結(jié)構(gòu)體實(shí)例時(shí),根據(jù)傳遞給構(gòu)造函數(shù)的參數(shù)對(duì)由自動(dòng)變量追加的成員變量進(jìn)行初始化。
接下里時(shí)使用Block的匿名函數(shù)的實(shí)現(xiàn)。
static void __main_block_func_0(struct __main_block_impl_0 *__cself) {
const char *fmt = __cself->fmt; // bound by copy
int val = __cself->val; // bound by copy
printf(fmt,val);
}
之前聲明定義的__main_block_impl_0結(jié)構(gòu)體實(shí)例的成員變量的自動(dòng)變量被使用到了Block語法表達(dá)式中。
總的來說,截獲到的自動(dòng)變量作為成員變量被追加到__main_block_impl_0結(jié)構(gòu)體中,在Block語法表達(dá)式執(zhí)行時(shí),再賦值給與之前相同表達(dá)式的自動(dòng)變量。