根据这个块编程教程:
以下嵌套块:
void (^(^myblockptr)(void (^)()))();
指向块的指针返回一个块的块
它说它等同于:
typedef void (^Block)();
Block (^myblockptr)(Block);
我猜(void (^)())
对应于参数,即(Block)
。但是,我无法看到嵌套表达式的哪个部分对应于返回的块。
您是否能够在嵌套表达式中识别返回的块?
答案 0 :(得分:7)
正如约书亚所说,在分析C声明时,从内到外开始是一个好主意。
void (^(^myblockptr)(void (^)()))();
由于myblockptr
是变量,让我们将声明拆分为两部分,变量的左侧和变量的右侧:
void (^(^myblockptr) (void (^)()))();
我们知道由于(^myblockptr)
^
是一个块,所以在它的左边我们应该找到它的返回类型,在它的右边我们应该找到它的参数类型。
让我们分析myblockptr
所采用的参数,向右移动。它们应该在(^myblockptr)
:
void (^(^myblockptr) (void (^)()) )();
这是一个单独的参数,因为^
:
void (^)()
现在很容易看到该参数是一个返回void
且不带参数的块。
向右移动,有一个右括号,所以我们需要分析最左边的部分:
void (^ (^myblockptr)…
我们看到myblockptr
返回一个返回void
的块。因为它返回一个块,所以我们应该找到返回块之后接受的参数类型,这个参数类型与最左边的开始paranthesis匹配:
void (^ (^myblockptr)(void (^)()) )();
因为它是()
,我们看到返回的块没有任何参数。
http://f.cl.ly/items/0N3l000g0X2f1O0F2B0n/blocks.png
总结:myblockptr
是一个块(右侧)接受一个块的参数,该块不带参数并返回void
和(左侧) )返回一个不带参数的块并返回void
。由于返回类型myblockptr
和(单个)参数类型相同:
typedef void (^Block)();
导致:
Block (^myblockptr)(Block);
您可能需要阅读Steve’s Reading C type declarations,并且正如Jeremy所提到的,Fish’s cdecl.org。
答案 1 :(得分:2)
您应该从里到外阅读块定义。
让我们分解。
void (^(^myblockptr)(void (^)()))();
void (^)()
声明一个参数块
RETURNTYPE (^myblockptr)(PARAMS)
使用params
myblockptr
的块
和外部void(^(....)())指的是块中的返回类型。
将它们放在一起可以获得原始声明。