宏中的do {} while(0)与({})的优点是什么?

Ale*_*x D 13 c macros

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

({ })表单的优点是它是一个表达式并且可以具有"返回值".它(主观地)读取也好于do { } while(0).那为什么不总是使用它?do { } while(0)相反,在宏中使用有什么优势?

Que*_*tin 31

因为({...})GCC扩展.