Программирование вложенных блоков - PullRequest
2 голосов
/ 21 октября 2011

Согласно этому руководству по программированию блока:

http://thirdcog.eu/pwcblocks/

Следующий вложенный блок:

void (^(^myblockptr)(void (^)()))();

Указатель на блок, возвращающий блок, принимающий блок

Он говорит, что это эквивалентно:

typedef void (^Block)();
Block (^myblockptr)(Block);

Полагаю, что (void (^)()) соответствует параметрам, т.е. (Block). Однако я не могу увидеть, какая часть вложенного выражения соответствует возвращенному блоку.

Можете ли вы идентифицировать возвращенный блок во вложенном выражении?

Ответы [ 2 ]

7 голосов
/ 21 октября 2011

Как сказал Джошуа, при анализе объявлений на Си лучше начинать изнутри.

void (^(^myblockptr)(void (^)()))();

Поскольку myblockptr - переменная, давайте разделим объявление на две части слевапеременной и справа от переменной:

void (^(^myblockptr)    (void (^)()))();

Мы знаем, что (^myblockptr) является блоком из-за ^, поэтому слева от него мы должны найти его тип возврата, а справамы должны найти типы его параметров.

Давайте проанализируем параметры, которые принимает myblockptr, двигаясь вправо.Они должны быть сгруппированы по скобкам сразу после (^myblockptr):

void (^(^myblockptr)    (void (^)())    )();

Это один параметр, который является блоком из-за ^:

void (^)()

и теперь это легкочтобы увидеть, что параметр является блоком, который возвращает void и не принимает параметров.

При перемещении вправо справа есть закрывающая скобка, поэтому нам нужно проанализировать крайнюю левую часть:

void (^    (^myblockptr)…

, где мы видим, что myblockptr возвращает блок, который возвращает void.Поскольку он возвращает блок, мы должны найти типы параметров, принятые возвращаемым блоком после закрывающей скобки, которая соответствует крайнему левому открытому парантезу:

void (^    (^myblockptr)(void (^)())    )();

, так как это (), мы видим, что возвращенный блок нене имеет никаких параметров.

http://f.cl.ly/items/0N3l000g0X2f1O0F2B0n/blocks.png

В итоге: myblockptr - это блок, который (справа) принимает параметр, который является блоком, который не принимает параметрови возвращает void и (слева) возвращает блок , который не принимает параметров и возвращает void.Поскольку тип возвращаемого значения myblockptr и (одиночный) тип параметра одинаковы:

typedef void (^Block)();

, что приводит к:

Block (^myblockptr)(Block);

Возможно, вы захотите прочитать Стив РидингОбъявления типа C и, как упомянул Джереми, Fish's cdecl.org .

2 голосов
/ 21 октября 2011

Вы должны прочитать определение блока изнутри.

Давайте разберем его.

void (^(^myblockptr)(void (^)()))();

void (^)() объявляет блок, который является параметром

RETURNTYPE (^myblockptr)(PARAMS) объявляет блок с именем myblockptr с параметрами

, а внешний void (^ (....) ()) ссылается на тип возврата из блока.

Собрав все вместе, вы получите оригинальную декларацию.

...