3

我注意到gcc接受如下代码:

if ( ({ int ret; /* code here */; ret }) == some_value)
    ...;

for ( i = ({ int ret; /* code here */; ret }); i < top; i++)
    ...;

等等。
可以创建一个匿名代码块并将其视为右值(只要最后一条语句是变量/值)。

这在某些情况下很有用——我发现的特定用例是以这种方式从内联汇编语句返回值。但也可以使用它来转换函数返回void但通过指针参数修改内存,例如:

void myfunc(int *arg) { *arg = ...; }

if ( ({int ret; myfunc(&ret); ret; }) == 54321) { ... };

我一直在试图找到文档证明这是 *normal8 / C标准允许这种事情,穷人的 lambda

谁能提供详细信息?

4

0 回答 0