【问题标题】:declaring block with auto用 auto 声明块
【发布时间】:2013-01-15 13:14:51
【问题描述】:

我可以用 auto 声明 ObjC 块吗?

auto fun = ^(int x) { NSLog(@"%d", x); }
fun(5);

我无法为此制定出有效的语法。

【问题讨论】:

  • 我怀疑 如果 它可以工作,它只适用于 Objective-C++,因为auto 在 C 中意味着不同的东西。
  • 显然在 C++0x 中有不同的含义,以前的 C++ 规范使用 C 中的 auto(这只是默认存储类型)。除非有超出此问题范围的原因,否则我鼓励在这种情况下根本不使用auto,而更喜欢int (^fun)(int) =。 (作为一名 Objective-C 开发人员,我从未使用过 auto,可能需要向我所有的同事解释。)

标签: c++ objective-c c++11 clang objective-c-blocks


【解决方案1】:

在声明fun 之后,您缺少;。否则,您的语法正确,Clang 将在 -std=c++11 -fblocks 模式下接受 C++ 或 Objective-C++ 输入。 (请注意,块实际上是一个正交扩展,不是 Objective-C 的一部分。)

【讨论】:

    【解决方案2】:

    我不认为 C++/Objective-C++ 中的 auto 关键字用于 Objective-C。

    至于为您的示例声明块变量,以下将在 Objective-C 中工作

    void(^fun)(int x) = ^(int x) {
    NSLog(@"%d",x);
    };
    
    fun(5);
    

    更多关于块的声明选项有一个很好的答案here

    【讨论】:

      【解决方案3】:

      auto 关键字是 c++11 关键字。 Objective-c 是 c 而不是 c++ 的超集,因此不包含 c++ 的属性,而是 c。至于objective-c++,我不认为clang 在所有新的c++11 特性上都是最新的,尤其是在构建objective-c++ 的编译器中。希望这会有所帮助!

      【讨论】:

      • Objective-C 是一组可以添加到 C 或 C++ 的扩展。 Clang 有一个非常全面的 C++11 实现(仅缺少几个特性),并且 C++ 和 Objective-C++ 使用相同的编译器。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      • 1970-01-01
      • 2014-12-10
      • 2016-04-23
      相关资源
      最近更新 更多