En parcourant le code source du compilateur gcc (gcc / c-family / c-pragma.c), je vois:
typedef struct GTY(()) align_stack {
int alignment;
tree id;
struct align_stack * prev;
} align_stack;
et même si j'ai beaucoup d'années de programmation C derrière moi, ces bits: (())
me sont encore totalement inconnus. Quelqu'un peut-il expliquer ce qu'ils signifient? Google ne semble pas le trouver.
GTY
? Ce n'est pas défini dans la norme de langue. Consultez votre code.GTY site:gcc.gnu.org
Réponses:
Ils sont «magiques» internes à GCC, c'est-à-dire qu'ils font partie de l'implémentation du compilateur elle-même.
Voir cette page qui parle de leur utilisation. La macro est utilisée pour marquer les types à des fins de garbage collection. Il peut aussi y avoir des arguments, voir cette page pour plus de détails.
UPDATE :: Comme indiqué par Drew Dorman dans un commentaire, la double parenthèse réelle ne fait pas partie de l '"intériorité" de l'implémentation GNU; ils sont couramment utilisés lorsque vous souhaitez rassembler une liste complète d'arguments en un seul argument pour la macro appelée. Cela peut parfois être utile lors de l'emballage, par exemple
printf()
. Voir cette question, pour en savoir plus sur cette technique .la source
(())
lui-même n'est pas de la magie gcc. Il permet à un texte contenant des virgules d'être passé à une macro en tant qu'argument unique. Pour tout compilateur C / C ++.En général, il est utilisé avec des macros pour protéger les virgules. Étant donné que
#define foo(a,b)
l'invocation de macrofoo(1,2,3)
serait illégale. L'utilisation d'une paire supplémentaire de parenthèses clarifie quelle virgule est protégée:foo((1,2),3)
versusfoo(1,(2,3))
.Dans ce cas, le
GTY
peut prendre plusieurs arguments, séparés par des virgules, mais toutes ces virgules doivent être protégées. C'est pourquoi l'intérieur()
entoure tous les arguments.la source
#define PRINT_A_LOT(a,b) printf("prefix\n"); printf a; printf("infix\n"); printf b; printf("suffix\n");
(en C ++, il existe de meilleures solutions que les macro, bien sûr).Macro((Pair<int, int>), ...)
. Bien que vous ayez alors des problèmes supplémentaires, vous vous débarrassez de la parenthèse dans la macro