Istnieje wiele pytań na temat przepełnienia stosu w związku z używaniem makr w postaci do { ... } while(0)
, ale jest to trochę inne. Rozumiem, dlaczego do { ... } while(0)
jest używane do zawijania wielu linii kodu w rozszerzeniu makr. Ale jest jeszcze inna forma, którą często widzę: ({ ... })
.Zalety: czy {} podczas (0) kontra ({}) w makrze?
Zaletą formularza ({ })
jest wyrażenie i może mieć "wartość zwracaną". To również (subiektywnie) czyta lepiej niż do { } while(0)
. Dlaczego więc nie jest zawsze używany? Jaka jest korzyść z używania zamiast tego do { } while(0)
w makrze?
Uwaga, w C++ 11 można uzyskać efekt * podobny * (o ile jest to wyrażenie) z '[&]() {/*...*/}()', ale wciąż ma kilka wad, takich jak niezdolność do "powrotu" (trzeba zaimplementować w stylu rust 'try!') lub użyć 'decltype' na wyrażenie (ponieważ lambdy nie są dozwolone w nieocenionych kontekstach). – o11c