c++-cli - “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 中。
但是,如果您使用的是 macOS(就像您在一条评论中暗示的那样),这是一个Objective-C 块。
它的语法非常非常奇怪。
该块就像一个 C++ 闭包和 Java 匿名内部类,它可以捕获变量。
__block int insider = 0;
void(^block)() = ^{
// print insider here using your favourite method, printf for example
};
这是一个完整的NSObject
(基本的 Objective-C 类),但是是可调用的,这不仅仅是一个函数指针。
现在,我们进入一个重要的问题,我想在 Linux 上运行它,如何???
LLVM 支持块语法,但您应该参考这个 StackOverflow 问题了解更多信息:Linux 中的 Clang 块?
因此,您应该在 LLVM 编译器中编译您的代码,并使用 -fblocks 和 -lBlocksRuntime。
不要忘记安装这些 Linux 软件包:
llvm clang libblocksruntime-dev
如果您已经在 macOS 上,只需使用 -fblocks。