Принцип буквального синтаксиса блока Objective-C

Я программист 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 ++, если есть кто-нибудь, кто может помочь мне понять принцип этого кода, я буду очень благодарен. Спасибо за вас, ребята.

0

Решение

Что ж, struct __main_block_impl_0первый член (impl) это struct __block_impl, Так что расположение struct __main_block_impl_0 совпадает с местоположением struct __block_impl это его первый член. Если у вас есть указатель на один, вы можете просто рассматривать его как указатель на другой.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]