2015-01-25 4 views
1

Я работаю через Advanced Mac OS X. Книга программирования и одно упражнение заставила меня споткнуться.Упростите объявление ссылки на блок с помощью typedefs

Использование определения типов для упрощения следующего блока ссылочного заявления:

int (^(*(^get_block_factory_funcptr)(void))(int))(void); 

Вот как я понимаю заявление:

Функция не принимают аргументы, возвращает блок, который возвращает указатель недействительного, который указатель на функцию, которая принимает int для аргумента и возвращает блок, который не имеет аргументов, возвращает int.

Теперь, учитывая, что у меня есть эти 2 Определения типов

typedef void *(^get_block_factory_funcptr)(void); 
typedef int (^myBlock(int))(void); 

Однако я понятия не имею, как объединить их в одной декларации, любая помощь приветствуется

ответ

2

Если я правильно читать, это блок, который возвращает указатель на функцию, который возвращает блок. Имя - это подсказка.

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

Что такое get_block_factory_funcptr? Это блок:

MyBlock get_block_factory_funcptr; 

Что это? Он принимает пустоту и возвращает указатель функции «Factory Factory». Давайте объявим MyBlock:

typedef FactoryFuncPtr (^MyBlock)(void); 

Что такое FactoryFuncPtr? Он принимает int и возвращает другой блок:

typedef OuterBlock (*FactoryFuncPtr)(int); 

Что OuterBlock? Он принимает void и возвращает int:

typedef int (^OuterBlock)(void); 

Таковы декларации в обратном порядке.

Редактировать: Рабочий пример.

#import <Foundation/Foundation.h> 

typedef int (^OuterBlock)(void); 
typedef OuterBlock (*FactoryFuncPtr)(int); 
typedef FactoryFuncPtr (^MyBlock)(void); 

OuterBlock factory(int foo) { 
    return^{ 
     printf("A block with %d\n", foo); 
     return 123; 
    }; 
} 

int main(int argc, const char * argv[]) { 
    @autoreleasepool { 
     int (^(*(^get_block_factory_funcptr)(void))(int))(void) =^{ 
      return &factory; 
     }; 

     MyBlock myBlock = get_block_factory_funcptr; 
     FactoryFuncPtr foo = myBlock(); 
     OuterBlock bar = foo(999); 
     int baz = bar(); 
     printf("Final %d\n", baz); 
    } 
    return 0; 
} 
+0

Учитывая то, что вы вывесили я должен быть в состоянии сделать следующее: 'FactoryFuncPtr х;', а затем сделать: 'Int (^ (* (^ get_block_factory_funcptr) (аннулируются)) (INT)) (аннулируются) = х; '. Но это приводит к ошибке о несовместимом назначении. – rmaddy

+0

@rmaddy 'get_block_factory_funcptr' - это блок. 'x' является указателем на функцию. Попробуйте 'x = get_block_factory_funcptr();' – Darren

+0

Я думал, что идея состоит в том, что с помощью typedefs вы можете назначить один для другого. Можете ли вы завершить свой ответ, чтобы показать, как типизация фактически эквивалентна оригинальной декларации? – rmaddy

Смежные вопросы