Я программист 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
это его первый член. Если у вас есть указатель на один, вы можете просто рассматривать его как указатель на другой.
Других решений пока нет …