首页 文章

使用typedef简化块引用声明

提问于
浏览
1

我正在使用高级Mac OS X编程书,一次练习让我跌跌撞撞 .

Use typedefs to simplify the following block reference declaration:

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 回答

  • 2

    如果我正确读取它,它是一个返回一个返回块的函数指针的块 . 这个名字是一个提示 .

    解决问题的一种方法是从最终结果开始并向后工作 . 或者,从内部开始向外工作 .

    什么是 get_block_factory_funcptr ?这是一个块:

    MyBlock get_block_factory_funcptr;
    

    它有什么作用?它需要一个void,它返回一个"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;
    }
    

相关问题