Обходит главную проблему таких вещей, как
#define max(a,b) ((a) > (b) ? a : b)
когда вы звоните с:
int x = max (a++, b--);
Так как это простая подстановка текста, это приводит к:
int x = ((a++) > (b--) ? a++ : b--);
что не что вы хотите.
Используя:
#define max(a,b) ({
typeof (a) _a = (a);\
typeof (b) _b = (b); \
_a > _b ? _a : _b; })
он использует временные переменные, которые фактически дают вам:
int x = ({ int _a = a++; int _b = b--; _a > _b ? _a : _b; })
, который запускает только побочные эффекты один раз.
Но, если честно, вам следует вообще отказаться от этого макроса и использовать функцию inline
или даже не встроенную функцию, поскольку в большинстве случаев компилятор может выполнять достойную работу по оптимизации даже без этого предложения.