Использование скобок ({…}) в макросах для проглатывания точки с запятой

Часто в макросах вы увидите, что люди используют do {.. .} while (0) , чтобы проглотить точку с запятой. Я только что наткнулся на пример, где вместо этого используется ({...}) , и кажется, что он не только проглатывает точку с запятой, но и позволяет вам возвращать значение:

#define NEW_MACRO()  ({ int x = 1; int y = 2; x+y; })

 if(1) 
   val = NEW_MACRO(); 
 else 
   printf("this never prints");`

val получится 3. Я не могу найти по нему никакой документации, поэтому я немного опасаюсь этого. Есть какие-нибудь ошибки? s этим методом?

6
задан Jonathan Leffler 24 March 2019 в 19:20
поделиться