在声明block
时,使用这种语法背后的理由是什么(左边是括号和插入符号)?
(^myBlock)
例如:
int (^myBlock)(int) = ^(int num) {
return num * multiplier;
};
答案 0 :(得分:2)
C BLOCKS:语法和用法
指向块的变量采用与指向函数的变量完全相同的语法,除了*替换为^。例如,这是一个函数指针,该函数指向一个带有int并返回float的函数:
float (*myfuncptr)(int);
这是一个块指针,指向一个接受int并返回float的块:
float (^myblockptr)(int);
与函数指针一样,您可能希望键入dede这些类型,否则会变得相对毛茸茸。例如,指向块返回块的块的指针将类似于void (^(^myblockptr)(void (^)()))();
,这几乎不可能被读取。一个简单的typedef后来,它更简单:
typedef void (^Block)();
Block (^myblockptr)(Block);
声明块本身是我们进入未知的地方,因为它看起来并不像C,尽管它们类似于函数声明。让我们从基础开始:
myvar1 = ^ returntype (type arg1, type arg2, and so on) {
block contents;
like in a function;
return returnvalue;
};
这定义了一个块文字(来自after = to和includes}),显式提到它的返回类型,参数列表,块体,return语句,并将这个文字赋给变量myvar1。
文字是可以在编译时构建的值。整数文字(int a = 3中的3;)和字符串文字(const char *中的“foobar”* b =“foobar”;)是文字的其他示例。当我们进入内存管理时,块声明是文字的这一事实很重要。
在像这样的块中查找返回语句对某些人来说很烦人。你可能会问,它是否从封闭功能返回?不,它返回一个可以由块的调用者使用的值。请参阅“调用块”。注意:如果块有多个return语句,则它们必须返回相同的类型。
最后,块声明的某些部分是可选的。这些是:
示例:
myblock1 = ^ int (void) { return 3; }; // may be written as:
myblock2 = ^ int { return 3; }
示例:
myblock3 = ^ void { printf("Hello.\n"); }; // may be written as:
myblock4 = ^ { printf("Hello.\n"); };
// Both succeed ONLY if myblock5 and myblock6 are of type int(^)(void)
myblock5 = ^ int { return 3; }; // can be written as:
myblock6 = ^ { return 3; };
答案 1 :(得分:1)
我认为的理由是它看起来像一个函数指针:
void (*foo)(int);
任何C程序员都应该熟悉。