使用typedef简化块引用声明

时间:2015-01-25 12:57:56

标签: objective-c

我正在使用高级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);

但是我不知道如何将它们组合成单个声明,任何帮助表示赞赏

1 个答案:

答案 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;
}