在Stack Overflow上有许多关于在宏中使用do { ... } while(0)的问题,但这里有点不同。我明白为什么do { ... } while(0)用于在宏扩展中包装多行代码。但我经常看到另一种形式:({ ... })。 ({ })形式的优点是它是一个表达式,可以有一个“返回值”。 它也(主观地)比do { } while(0)更易读。 那么为什么它不总是被使用呢? 在宏中使用do { } while(0)有什么优势呢?
[&](){/*...*/}()
获得类似的效果(就表达式而言),但它仍然有几个缺点,例如无法return
(需要实现类似Rust的try!
)或在表达式上使用decltype
(因为lambda在未评估的上下文中不允许)。 - o11c