2010-01-16 9 views
8

me he dado cuenta de que a veces, C macros se escriben como algo parecido a esto:Más información sobre `({});` en C?

#define foo(bar) ({ ++bar; }) 

Después de algunos experimentos, he encontrado que:

  1. ({}); compilará, pero no hacen nada. (Como se esperaba.)
  2. Si deja ; desactivado, se producirá un error de sintaxis. Un efecto secundario de esto es garantizar que foo() se parece a una función en su código. (Aunque, si deja el punto y coma apagado, ¡el error no es muy útil para diagnosticar el problema!)
  3. return ({}); se queja de un valor nulo no ignorado, como si hubiera intentado usar una función nula.

¿Esto es solo para que los desarrolladores agreguen un punto y coma a sus macros, o tiene otro propósito? Probé con Google, pero falla miserablemente con la puntuación. ¿Hay un nombre para esto?

Respuesta

8

Esta es una extensión de GNU llamada statement expressions.

Al declarar macros en estándar-C, a menudo se ve do...while(0) bucles utilizados para fines similares (es decir, la creación de un alcance de bloque). Una expresión de declaración es superior al hack de bucle porque puede devolver un valor. Si desea hacer algo similar en la norma C, deberá definir una función adicional y perder la conveniencia de la determinación del alcance léxico.

2

() es una expresión. ({code; code;}) es una declaración compuesta dentro de una expresión. Esa es una extensión GNU C.

http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_4.html

EDIT: wow, tengo que enlazan de Google y no se dio cuenta que era para gcc 2.95 en un principio. ¡Antiguo!

+0

Antigua - pero la sintaxis aún se admite en 4.4.2. –

3

Lo bueno de las expresiones de expresiones (si hay algo genial) es que la última declaración es el resultado de la expresión.

#define foo(bar) ({ ++bar; 3.1415927; }) 

int i = 0; 
float pi = foo(i); 
Cuestiones relacionadas