【问题标题】:Block syntax error from Apple example 'Creating a Block'Apple 示例“创建块”中的块语法错误
【发布时间】:2013-07-01 06:09:09
【问题描述】:

使用文档中的apple's example

float (^oneFrom)(float);


oneFrom = ^(float aFloat) {

  float result = aFloat - 1.0;

  return result;

};

我收到两个错误:

  1. 使用不同类型重新定义“oneFrom”:“int”与“float(^)(float)”
  2. 缺少类型说明符,默认为 'int'

也来自文档..

如果你没有显式声明一个块的返回值 表达式,它可以从内容中自动推断出来 堵塞。如果返回类型被推断并且参数列表为空, 那么您也可以省略 (void) 参数列表。如果或何时 存在多个返回语句,它们必须完全匹配(使用 必要时进行铸造)。

【问题讨论】:

    标签: objective-c objective-c-blocks


    【解决方案1】:

    那个块没有返回类型,默认返回类型是void,你需要去

    float (^oneFrom)(float);
    
    oneFrom = ^ float (float aFloat) {
    
      float result = aFloat - 1.0;
    
      return result;
    
    };
    

    here 是一个更好的块示例

    【讨论】:

    • 这个例子仍然报同样的错误。我错过了什么明显的东西吗?
    • 没有。该块具有从实际的return 语句中扣除的返回类型。它具有正确的 float 类型。
    • 啊,是的,我的错误,我总是出于某种原因隐含地这样做。您的答案可能也是这里真正的解决方案,没有考虑在哪里定义块
    • @nikolai 我认为您的意思是“扣除”而不是“扣除”。也许“推断”会是更好的词选择?
    【解决方案2】:

    您不能在文件范围内定义块,只能在函数中定义。这按预期工作:

    void foo (void)
    {
        float (^oneFrom)(float);
        oneFrom = ^(float aFloat) {
            float result = aFloat - 1.0;
            return result;
        };
    }
    

    【讨论】:

    • 我的理解是块类似于C函数指针。我不应该可以在头文件中声明它吗?
    • @estobbart 不,块是一个比函数指针复杂得多的概念。最重要的是:它们携带数据,因此必须在堆栈或堆上动态分配。 C 不允许初始化具有静态存储持续时间的对象,因此您不能在文件范围内定义块。
    • @estobbart 当然,您可以在头文件中使用extern 声明块类型变量。但是,您不能定义块。
    • 明白。有许多声明块的例子。是否存在使用块声明的情况?看起来块几乎总是被用作块文字。
    • 一个例子是块类型的属性,例如NSFileHandlereadabilityHandler
    猜你喜欢
    • 1970-01-01
    • 2021-01-10
    • 2019-10-23
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多