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

Rya*_*Fox 8 c macros gcc

我注意到有时候,C宏写得像这样:

#define foo(bar) ({ ++bar; })
Run Code Online (Sandbox Code Playgroud)

经过一些实验,我发现:

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

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

Chr*_*oph 8

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

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