1

当声明block使用这种语法的基本原理是什么时(即左边的括号和插入符号)?

(^myBlock) 

例如:

int (^myBlock)(int) = ^(int num) {
    return num * multiplier;
};
4

2 回答 2

2

C 块:语法和用法

指向块的变量采用与指向函数的变量完全相同的语法,除了 * 替换为 ^。例如,这是一个函数指针,指向一个采用 int 并返回 float 的函数:

float (*myfuncptr)(int);

这是一个块指针,指向一个采用 int 并返回一个浮点数的块:

float (^myblockptr)(int);

与函数指针一样,您可能希望对这些类型进行 typedef,否则它会变得相对复杂。例如,一个指向一个块的指针返回一个块,该块将类似于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 = 到并包括 }),明确提及它的返回类型、参数列表、块体、return 语句,并将此文字分配给变量 myvar1。

文字是可以在编译时构建的值。整数文字(int a = 3; 中的 3)和字符串文字(const char *b = "foobar"; 中的 "foobar")是文字的其他示例。当我们进入内存管理时,块声明是文字这一事实很重要。

在这样的块中找到 return 语句对某些人来说是令人烦恼的。您可能会问,它是否从封闭函数返回?不,它返回一个可供块调用者使用的值。请参阅“调用块”。注意:如果块有多个返回语句,它们必须返回相同的类型。

最后,块声明的某些部分是可选的。这些都是:

  • 参数列表。如果该块没有参数,则可以完全跳过参数列表。

例子:

myblock1 = ^ int (void) { return 3; }; // may be written as:
myblock2 = ^ int { return 3; }
  • 返回类型。如果块没有返回语句,则假定为 void。如果块有一个 return 语句,则从它推断返回类型。这意味着您几乎总是可以跳过声明中的返回类型,除非它可能不明确。

例子:

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; };

来源:http ://thirdcog.eu/pwcblocks/

于 2012-11-09T10:53:19.940 回答
1

认为基本原理是它看起来像一个函数指针:

void (*foo)(int);

任何 C 程序员都应该熟悉它。

于 2012-11-09T10:55:23.050 回答