首页 > 解决方案 > “typedef void (^Something)()” 是什么意思

问题描述

我试图编译stk。在配置期间我收到错误

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

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

代码片段:

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

标签: c++-cli

解决方案


正如这里的其他回答者所说,它可能在 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 问题了解更多信息:Linux 中的 Clang 块?

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

不要忘记安装这些 Linux 软件包:

llvm clang libblocksruntime-dev

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


推荐阅读