“ typedef void(^ Something)()”是什么意思

时间:2018-10-06 22:16:08

标签: c++-cli

我正在尝试编译stk。在配置过程中出现错误

  

系统/库/框架/CoreAudio.framework/Headers/AudioHardware.h:162:2:   错误:预期标识符或'('之前的'(')令牌   (^ AudioObjectPropertyListenerBlock)(

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

代码段:

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

1 个答案:

答案 0 :(得分:0)

正如这里的其他答复者所说,可能是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。