关于`({});`的更多信息?

我注意到有时,C宏被写成这样的东西:

#define foo(bar) ({ ++bar; }) 

经过一些实验,我发现:

  1. ({}); 会编译,但什么都不做。 (正如所料。)
  2. 离开; off会导致语法错误。 这样做的副作用是确保foo()看起来像代码中的函数。 (虽然,如果关闭分号,错误对诊断问题不是很有用!)
  3. return ({}); 抱怨虚假值不被忽略,就像我试图使用void函数一样。

这只是为了让开发人员在他们的宏中添加分号,还是有另一个目的? 我已经尝试过谷歌,但是标点符号失败了。 这有名字吗?

这是一个名为语句表达式的GNU扩展。

在标准C中声明宏时,您经常会看到do...while(0)循环用于类似目的(即创建块作用域)。 语句表达式优于循环黑客,因为它可以返回值。 如果你想在标准C中做类似的事情,你必须定义一个额外的function,并失去词法范围的便利。

关于语句表达式的一件很酷的事情(如果有一件很酷的事情)是最后一个语句是表达式的结果。

 #define foo(bar) ({ ++bar; 3.1415927; }) int i = 0; float pi = foo(i); 

()是一个表达式。 ({code; code;})是表达式中的复合语句。 这是一个GNU C扩展。

http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_4.html

编辑:哇,我从谷歌那里得到了这个链接,并没有注意到它最初是用于gcc 2.95。 古!