【问题标题】:What does “typedef void (^Something)()” mean [duplicate]“typedef void (^Something)()”是什么意思[重复]
【发布时间】:2018-10-06 22:16:07
【问题描述】:

我试图编译stk。在配置过程中我收到错误

System/Library/Frameworks/CoreAudio.framework/Headers/AudioHardware.h:162:2: 错误:预期标识符或 '(' 在 '^' 标记之前 (^AudioObjectPropertyListenerBlock)(

当我看到代码时,我在 here 的第 162 行的函数指针声明中看到了 ^。我知道我们可以拥有*,但^ 是什么意思?

代码sn-p:

#if defined(__BLOCKS__)
typedef void
(^AudioObjectPropertyListenerBlock)(    UInt32                              inNumberAddresses,
                                        const AudioObjectPropertyAddress    inAddresses[]);

【问题讨论】:

  • 这意味着你使用的不是 C++,而是 C++/CLI,这是微软对 C++ 的混蛋,是你通常不想使用的东西。
  • 与 C++/CLI 无关(注意“MacOSX-SDKs”),Apple 这样做就可以了:stackoverflow.com/questions/1912023/caret-in-objective-c
  • Objective-C 不是 C; Objective-C++ 不是 C++。无论你编译什么文件都包含一个 Objective-C 头文件,所以源代码需要编译为 Objective-C 或 Objective-C++。

标签: c++-cli


【解决方案1】:

正如其他回答者所说,它可能在 C++/CLI 中。

而且,如果您使用的是 macOS(就像您在一条评论中暗示的那样),这是一个 Objective-C 块。

它的语法很奇怪。

块就像一个C++闭包和Java匿名内部类,它可以捕获变量。

__block int insider = 0;

void(^block)() = ^{
    // print insider here using your favourite method,  printf for example
};

这是一个完整的NSObject(Objective-C 基础类),但它是可调用的,这不仅仅是一个函数指针。

请参阅此 Apple 文档:https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/WorkingwithBlocks/WorkingwithBlocks.html

现在,我们进入一个重要的问题,我想在 Linux 上运行它,如何???

LLVM 支持块语法,但您应该参考这个 StackOverflow 问题了解更多信息:Clang block in Linux?

因此,您应该在 LLVM 编译器中编译您的代码,并使用 -fblocks 和 -lBlocksRuntime。

别忘了安装那些 Linux 软件包:

llvm 铛 libblocksruntime-dev

如果您已经在 macOS 上,只需使用 -fblocks。

【讨论】:

  • 是的,添加 `-fblocks` 和 -lBlocksRuntime 就可以了。
猜你喜欢
  • 2011-04-28
  • 1970-01-01
  • 2012-10-03
  • 2014-04-22
  • 2014-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多