Objective-C 块文字语法原则
Objective-C Block Literal Syntax Principle
我是来自中国的iOS程序员,很抱歉我无法为这个问题做一个确切的标题,但我会尝试详细描述它。如果有人可以帮助我更改标题,我非常感谢。对不起,我的英语不好。
当我使用 clang -rewrite-objc
查看有关块语法的源代码时,我发现有些东西我无法理解。这是我的代码:
int main(int argc, char *argv[]) {
void (^blk)() = ^ {
};
blk();
}
核心源代码是
struct __block_impl {
void *isa;
int Flags;
int Reserved;
void *FuncPtr;
};
struct __main_block_impl_0 {
struct __block_impl impl;
struct __main_block_desc_0* Desc;
__main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, int flags=0) {
impl.isa = &_NSConcreteStackBlock;
impl.Flags = flags;
impl.FuncPtr = fp;
Desc = desc;
}
};
static void __main_block_func_0(struct __main_block_impl_0 *__cself) {
}
static struct __main_block_desc_0 {
size_t reserved;
size_t Block_size;
} __main_block_desc_0_DATA = { 0, sizeof(struct __main_block_impl_0)};
int main(int argc, char *argv[]) {
void (*blk)() = ((void (*)())&__main_block_impl_0((void *)__main_block_func_0, &__main_block_desc_0_DATA));
((void (*)(__block_impl *))((__block_impl *)blk)->FuncPtr)((__block_impl *)blk);
}
在主函数中,当我调用 blk(( 时,源代码会强制转换 blk 并通过此代码获取 FuncPtr。
((__block_impl *)blk)->FuncPtr)
我真的不明白,这是应该做的吗?在我看来,我更喜欢使用
(((__main_block_impl_0 *)blk ->impl).FuncPtr)
我真的不知道C++,如果有人可以帮助我理解这段代码的原理,我将非常感激。谢谢你们。
嗯,struct __main_block_impl_0
的第一个成员(impl
(是一个struct __block_impl
。因此,struct __main_block_impl_0
的位置与其第一个成员的struct __block_impl
的位置相同。如果你有一个指针,你可以把它当作另一个的指针。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 助记符和指向成员语法的指针
- 有人能分解一下这个c++模板的语法吗
- C++避免重复声明的语法是什么
- QMetaObject invokeMethod的基于函数指针的语法
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 单独定义模板化嵌套类方法的正确语法
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 错误 C2760:语法错误:映射迭代器上意外的标记"标识符",预期的";"
- 为什么我会收到错误 C2143 语法错误:缺少"*"之前的';'?
- 奇怪的代码抛出编译错误模板< J,int aSize=10> C2143:语法错误:在"<"之前缺少";"
- 使用基类指针调用基类的值构造函数的语法是什么?
- С++ wxWidgets:代码架构,设计原则和模式
- 很好的语法来获取对向量/数组数据的大小引用?
- C++语法运算符功能?
- C++使用 rand 定义函数语法
- 什么文件可以修改 atom 的C++语法?
- 创建模板嵌套类实例的语法?
- Objective-C 块文字语法原则