Cos'è questo (( ))?


90

Durante la navigazione nel codice sorgente del compilatore gcc (gcc / c-family / c-pragma.c) vedo:

typedef struct GTY(()) align_stack {
  int                  alignment;
  tree                 id;
  struct align_stack * prev;
} align_stack;

e (())nonostante avessi molti anni di programmazione in C alle spalle, questi bit: mi sono ancora completamente sconosciuti. Qualcuno può spiegare cosa significano? Google non sembra trovarlo.


E cos'è questo GTY? Non è definito nello standard del linguaggio. Visualizza il tuo codice.
Alexey Frunze

7
GTY è una macro ???
Anshul

1
Puoi trovarlo su Google specificando il sito nella stringa di query come segue:GTY site:gcc.gnu.org
ericson

Risposte:


81

Sono "magie" interne a GCC, cioè parte dell'implementazione stessa del compilatore.

Vedi questa pagina che parla del loro utilizzo. La macro viene utilizzata per contrassegnare i tipi per scopi di garbage collection. Possono esserci anche degli argomenti, vedere questa pagina per i dettagli.

AGGIORNAMENTO :: Come sottolineato da Drew Dorman in un commento, le attuali doppie parentesi non fanno parte dell '"interiorità" dell'implementazione GNU; sono comunemente usati quando si desidera raccogliere un intero elenco di argomenti in un singolo argomento per la macro chiamata. Questo può essere utile a volte anche durante il wrapping printf(), ad esempio . Vedi questa domanda, per ulteriori informazioni su questa tecnica .


5
La spiegazione di @Krishnabhadra può essere trovata sul sito collegato. Ulteriori spiegazioni sulle caratteristiche del GCC relative all'imo marcatore GTY andrebbero oltre lo scopo di questa particolare domanda e risposta.
Arne Mertz

30
(())di per sé non è magia gcc. Consente di passare un testo che include virgole a una macro come un singolo argomento. Per qualsiasi compilatore C / C ++.
Drew Dormann

45

In generale, viene utilizzato con le macro per schermare le virgole. Dato #define foo(a,b), l'invocazione della macro foo(1,2,3)sarebbe illegale. L'uso di una coppia extra di parentesi chiarisce quale virgola è schermata: foo((1,2),3)contro foo(1,(2,3)).

In questo caso, GTYpuò accettare più argomenti, separati da virgole, ma tutte queste virgole devono essere schermate. Ecco perché l'interno ()circonda tutti gli argomenti.


2
Puoi spiegare perché qualcuno dovrebbe usare una tale chiamata?
Swaechter

5
Ad esempio #define PRINT_A_LOT(a,b) printf("prefix\n"); printf a; printf("infix\n"); printf b; printf("suffix\n");(in C ++ ci sono soluzioni più belle delle macro, ovviamente).
MSalters

@Albertus: sarebbe anche carino se passassi i modelli a una macro Macro((Pair<int, int>), ...). Anche se poi
incappi
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.