Mientras navego por el código fuente del compilador gcc (gcc / c-family / c-pragma.c) veo:
typedef struct GTY(()) align_stack {
int alignment;
tree id;
struct align_stack * prev;
} align_stack;
e independientemente de tener muchos años de programación en C detrás de mí, estos bits (())
son totalmente desconocidos para mí todavía. ¿Alguien puede explicar qué significan? Google no parece encontrarlo.
GTY
? No está definido en el estándar del idioma. Vea su código.GTY site:gcc.gnu.org
Respuestas:
Son "magia" interna de GCC, es decir, parte de la propia implementación del compilador.
Vea esta página que habla sobre su uso. La macro se utiliza para marcar tipos con fines de recolección de basura. También puede haber argumentos, consulte esta página para obtener más detalles.
ACTUALIZACIÓN : Como señaló Drew Dorman en un comentario, el doble paréntesis real no es parte de la "internalidad" de la implementación GNU; se usan comúnmente cuando desea recopilar una lista completa de argumentos en un solo argumento para la macro llamada. Esto puede ser útil a veces al envolver
printf()
, por ejemplo , también. Consulte esta pregunta para obtener más información sobre esta técnica .fuente
(())
en sí mismo no es magia gcc. Permite que un texto que incluye comas se pase a una macro como un único argumento. Para cualquier compilador de C / C ++.En general, se usa con macros para proteger las comas. Dado
#define foo(a,b)
, la invocación macrofoo(1,2,3)
sería ilegal. El uso de un par de paréntesis adicional aclara qué coma está protegida:foo((1,2),3)
versusfoo(1,(2,3))
.En este caso,
GTY
puede tomar varios argumentos, separados por comas, pero todas estas comas deben estar protegidas. Por eso el interior()
rodea todos los argumentos.fuente
#define PRINT_A_LOT(a,b) printf("prefix\n"); printf a; printf("infix\n"); printf b; printf("suffix\n");
(en C ++ hay mejores soluciones que las macro, por supuesto).Macro((Pair<int, int>), ...)
. Aunque luego corre en problemas adicionales, deshacerse del paréntesis dentro de la macro