Ваш синтаксис типа неверен. Исходя из вашего использования, я предполагаю, что вы объявляете f2b
указателем на блок, который берет указатель на функцию, которая принимает int
и char **
и возвращает int
, и блок возвращает другой блок, который принимает int
и char **
и возвращает int
.
Правильный синтаксис для этого объявления:
int (^(^f2b)(int (*) (int, char **)))(int, char **)
Синтаксис для более сложных типов C часто нелогичен, особенно в случае нескольких уровней функций и массивов.
Всегда полезный веб-сайт cdecl.org поддерживает блоки: объявляет f2b как блок (указатель на функцию (int, указатель на указатель на char), возвращающий int), возвращающий блок (int, указатель на указатель на char), возвращающий int (они говорят «блок», тогда как я говорю «указатель на блок»)
Ваше определение блока, записанное с использованием полного литерального синтаксиса блока (включая возвращаемые типы), будет выглядеть примерно так (не забудьте скопировать блок для его возврата):
int (^(^f2b)(int (*) (int, char **)))(int, char **) =
^int (^(int (*func)(int, char **)))(int, char **) {
return Block_copy(^int (int argc, char **argv) {
return func(argc, argv);
});
};
Типы возврата могут быть опущены в литералах блока, поэтому его можно записать так:
int (^(^f2b)(int (*) (int, char **)))(int, char **) =
^(int (*func)(int, char **)) {
return Block_copy(^(int argc, char **argv) {
return func(argc, argv);
});
};