Как `({…})` возвращает значение?

Недавно я нашел этот макрос GCC:

#define max(a,b) \
   ({ typeof (a) _a = (a); \
       typeof (b) _b = (b); \
     _a > _b ? _a : _b; })

Я не осознавал, прежде чем увидел этот код, что блок кода {...} может каким-то образом возвращать значение в C.
1) Не могли бы вы мне подсказать, как это работает?

Хотя обычно мне удавалось достичь того же результата, злоупотребляя оператором запятой:

#define max(a,b) \
    (typeof (a) _a = (a), \
     typeof (b) _b = (b), \
     (_a > _b ? _a : _b)) 

, или если бы это было только для побочного эффекта, я бы использовал do {...} while (0)

2) Каков предпочтительный способ сделать это?

11
задан Jens Gustedt 23 May 2015 в 15:32
поделиться