Que es esto (( ))?

90

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.

Ferenc Deak
fuente
Y ¿qué es esto GTY? No está definido en el estándar del idioma. Vea su código.
Alexey Frunze
7
¿GTY es una macro?
Anshul
1
Puede encontrarlo en Google especificando el sitio en la cadena de consulta de la siguiente manera:GTY site:gcc.gnu.org
ericson

Respuestas:

81

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 .

relajarse
fuente
5
La explicación de @Krishnabhadra se puede encontrar en el sitio vinculado. Una explicación más detallada sobre las características de GCC relacionadas con el marcador GTY imo estaría más allá del alcance de esta pregunta y respuesta en particular.
Arne Mertz
30
(())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 ++.
Drew Dormann
45

En general, se usa con macros para proteger las comas. Dado #define foo(a,b), la invocación macro foo(1,2,3)sería ilegal. El uso de un par de paréntesis adicional aclara qué coma está protegida: foo((1,2),3)versus foo(1,(2,3)).

En este caso, GTYpuede tomar varios argumentos, separados por comas, pero todas estas comas deben estar protegidas. Por eso el interior ()rodea todos los argumentos.

MSalters
fuente
2
¿Puede explicar por qué alguien debería usar una llamada así?
swaechter
5
Por ejemplo #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).
MSalters
@Albertus: también sería bueno, si pasa plantillas a una macro Macro((Pair<int, int>), ...). Aunque luego corre en problemas adicionales, deshacerse del paréntesis dentro de la macro
BeniBela