do { } while(0) 与 ({ }) 在宏中的优势?

Advantages of do { } while(0) versus ({ }) in a macro?

Stack Overflow 上有很多关于在宏中使用 do { ... } while(0) 的问题,但这有点不同。我明白为什么 do { ... } while(0) 用于在宏扩展中包装多行代码。但是我经常看到另一种形式:({ ... }).

({ })形式的优点是它是一个表达式,可以有一个"return value"。它也(主观上)读起来比 do { } while(0) 好。那么为什么不总是使用它呢?在宏中使用 do { } while(0) 有什么好处?

因为({...})a GCC extension.