【发布时间】:2019-02-09 18:14:20
【问题描述】:
类似/跟进这个问题: Syntax to define a Block that takes a Block and returns a Block in Objective-C
我知道这不是我想做的事情,但我想了解为什么我不能使用单个 typedef 来定义:
typedef void (^XYZSimpleBlock)(void);
typedef XYZSimpleBlock (^ComplexBlock)(void);
为什么上面的有效,而这个无效?
typedef void(^)(void) (^ComplexBlock)(void);
如果我通过类似的答案,我发现我可以尝试像编译器一样解析它,但我是一个糟糕的编译器。
按照 C 的左右规则,第一个标识符不是 ComplexBlock?
typedef void(^)(void) (^ComplexBlock)(void);
// parser reads left right and finds ComplexBlock first
然后它会向右找到声明的结尾,然后向左直到找到插入符号,然后向右解释参数列表。
这将我们带到
typedef void(^)(void) (^ComplexBlock)(void);
// | unhandled |compiled/interpreted|
此时它无法将void(^)(void) 读取为返回类型是怎么回事?
让我感到困惑的是,使用 typedef 基本上只是一个 #define,所以它不应该与上面的基本相同吗?
typedef void (^XYZSimpleBlock)(void);
same as:
void(^)(void)
so:
typedef XYZSimpleBlock (^ComplexBlock)(void);
should be the same as:
typedef void(^)(void) (^ComplexBlock)(void);
我在这里遗漏了一些东西......
【问题讨论】:
-
这不是C代码!我想你可以留下 c-tag。
-
好电话,正在删除。我认为这可能与底层的 c 编译器有关,但可能不足以证明标签的合理性。
标签: objective-c