我正在使用高级Mac OS X编程手册和一个练习让我磕磕绊绊。
使用typedef简化以下块引用声明:
int (^(*(^get_block_factory_funcptr)(void))(int))(void);
以下是我对宣言的理解:
函数不接受参数,返回一个返回void指针的块,该指针指向一个函数的指针,该函数接受一个参数的int并返回一个没有参数的块,返回一个int。
现在,我有这两个typedef
typedef void *(^get_block_factory_funcptr)(void);
typedef int (^myBlock(int))(void);
但是我不知道如何将它们组合成单个声明,任何帮助表示赞赏
答案 0 :(得分:2)
如果我正确读取它,它就是一个返回一个返回一个块的函数指针的块。这个名字是一个提示。
解决问题的一种方法是从最终结果开始并向后工作。或者,从内部开始向外工作。
什么是get_block_factory_funcptr
?这是一个街区:
MyBlock get_block_factory_funcptr;
它做什么?这需要一个空白,它会返回一个" Block 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;
}