¿Se pueden envolver los ámbitos entre paréntesis y devolver un valor en C?

Busqué la definición de MIN en Mac OS X y encontré esto:

 #define MIN(A,B) ({ __typeof__(A) __a = (A); __typeof__(B) __b = (B); __a < __b ? __a : __b; }) 

No es tan obvio al principio, pero cuando se expande, se convierte en algo que me parece extremadamente extraño:

 int a = 1, b = 2; // int min = MIN(a, b); int min = ({ int __a = (a); int __b = (b); __a < __b ? __a : __b; }); 

Este es, de hecho, un ámbito envuelto en una expresión que “devuelve” el valor de la última expresión. Parece funcionar, al menos con clang, con un código bastante arbitrario dentro del scope:

 int a = ({ time_t x = time(NULL); if (x % 3 == 1) x++; x % 10; }); 

Nunca había visto esto antes, y me preguntaba si es estándar. Sé a ciencia cierta que Visual Studio no lo aceptará, pero, de nuevo, Visual Studio está atascado con C89, por lo que no es muy revelador.

Esta es una extensión de GCC al estándar C llamado Statement Expressions . Sí, puede usarlo si solo necesita admitir comstackdores GNU (y es multiplataforma). Si necesita atenerse al estándar C, no utilizará la notación.