【问题标题】:Simplify block reference declaration using typedefs使用 typedef 简化块引用声明
【发布时间】:2015-01-25 12:57:55
【问题描述】:

我正在阅读《高级 Mac OS X 编程》一书,其中一项练习让我跌跌撞撞。

使用 typedef 来简化以下块引用声明:

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

以下是我对声明的理解:

函数不带参数,返回一个块,该块返回一个 void 指针,它是一个指向函数的指针,该函数接受 int 作为参数并返回一个没有参数的块,返回一个 int。

现在,我有这 2 个 typedef

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

但是我不知道如何将它们组合成一个声明,感谢任何帮助

【问题讨论】:

    标签: objective-c


    【解决方案1】:

    如果我没看错的话,它是一个块,它返回一个返回块的函数指针。这个名字是一个提示。

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

    get_block_factory_funcptr 是什么?这是一个块:

    MyBlock get_block_factory_funcptr;
    

    它有什么作用?它需要一个 void 并返回一个“块工厂”函数指针。让我们声明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;
    }
    

    【讨论】:

    • 鉴于您发布的内容,我应该能够执行以下操作:FactoryFuncPtr x;,然后执行:int (^(*(^get_block_factory_funcptr)(void))(int))(void) = x;。但这会导致关于不兼容分配的错误。
    • @rmaddy get_block_factory_funcptr 是一个块。 x 是一个函数指针。试试x = get_block_factory_funcptr();
    • 我认为这个想法是通过使用 typedef,您可以将一个分配给另一个。您能否完成您的答案以说明 typedef 与原始声明实际上是如何等效的?
    • 好的,我明白我的错误了。我应该这样做:MyBlock x;,而不是FactoryFuncPtr x;。我读错了typedef。非常好。
    • 很遗憾,对于一个复杂问题的如此好的答案几乎不会被认可。 SO 似乎奖励对大众更容易理解的琐碎问题的简单回答。
    猜你喜欢
    • 2012-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-23
    相关资源
    最近更新 更多