^ {<stmts ..>}()在C中是什么意思?

时间:2019-02-07 08:00:48

标签: c syntax objective-c-blocks

enter image description here

在阅读LLVM静态分析器文档之一时,我偶然发现了 strange 运算符。

^{ int y = x; }();

我知道我可以在{...}之类的函数中定义一个嵌套块,但是我们甚至可以调用吗?另外,我从未见过将 ^ 放在大括号块前面的任何用法。我以为这是GCC支持的一种语言扩展,并用匿名函数 lambda 这样的关键字在Google上进行了搜索,但没有用。有谁对此有任何想法吗?

1 个答案:

答案 0 :(得分:9)

来自Clang 9 Documentation Language Specification for Blocks,它是一个 Block Literal Expression 。它的格式为(来自wiki):

^return_type ( parameters ) { function_body }

但是:

  

如果省略了返回类型,并且参数列表为(void),则也可以省略(void)参数列表。

以下内容:

^{ int y = x; }();

等于:

( ^void (void) { int y = x; } )();

等于:

void (^f)(void) = ^void (void) { int y = x; };
f();

它声明执行int y = x并且在声明executes之后立即执行的块文字。