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

9

enter image description here

在阅读LLVM静态分析器文档时,我遇到了一个奇怪的运算符。
^{ int y = x; }();

我知道我可以在函数内定义一个嵌套块,像 { ... },但我们甚至可以调用它吗?此外,我从未见过在花括号块前面放置^的任何用法。我认为这是GCC支持的一种语言扩展,并用关键词“匿名函数”或“lambda”进行了谷歌搜索,但没有结果。有人对此有什么想法吗?

2
https://en.wikipedia.org/wiki/Blocks_%28C_language_extension%29 - melpomene
可能是 https://stackoverflow.com/questions/28092207/why-can-c-files-contain-blocks 的重复问题。 - Martin R
1个回答

9

这是来自于Clang 9文档中有关Blocks的语言规范,它是一个块字面表达式,形式如下(源自维基百科):

^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,并在声明后立即执行它。

这是一个C++ lambda在C中的实现? - rubenvb
@rubenvb 确实看起来非常相似 - Gwangmu Lee
1
@rubenvb 是的。我认为只有clang/llvm通常支持它。一般来说,尽量不要使用它,因为它并不那么流行。在C语言中,编写可移植代码很受欢迎。GCC具有扩展块和本地函数扩展,因此您需要以不同的方式编写lambda函数。 - KamilCuk
2
@KamilCuk 如果你写iOS或macOS代码,那么这是很流行的。但是,正如你所说,块不应该在跨平台代码中使用。 - trojanfoe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接