Co to jest (( ))?

90

Przeglądając kod źródłowy kompilatora gcc (gcc / c-family / c-pragma.c) widzę:

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

i niezależnie od tego, że mam za sobą wiele lat programowania w C, te bity: (())są jeszcze dla mnie całkowicie nieznane. Czy ktoś może wyjaśnić, co mają na myśli? Wydaje się, że Google go nie znajduje.

Ferenc Deak
źródło
A co to jest GTY? Nie jest zdefiniowane w standardzie językowym. Zobacz swój kod.
Alexey Frunze
7
czy GTY to makro ???
Anshul
1
Możesz go znaleźć w Google, określając witrynę w ciągu zapytania w następujący sposób:GTY site:gcc.gnu.org
ericson

Odpowiedzi:

81

Są wewnętrzną "magią" GCC, tj. Częścią samej implementacji kompilatora.

Zobacz tę stronę, która mówi o ich użyciu. Makro służy do oznaczania typów do celów czyszczenia pamięci. Mogą być również argumenty, zobacz tę stronę, aby uzyskać szczegółowe informacje.

AKTUALIZACJA :: Jak zauważył Drew Dorman w komentarzu, faktyczne podwójne nawiasy nie są częścią „wewnętrznego charakteru” implementacji GNU; są często używane, gdy chcesz zebrać całą listę argumentów w jeden argument dla wywołanego makra. Może to być przydatne czasami np printf(). Podczas owijania . Zobacz to pytanie, aby uzyskać więcej informacji na temat tej techniki .

rozwijać
źródło
5
Wyjaśnienie @Krishnabhadra można znaleźć na połączonej stronie. Dalsze wyjaśnienie funkcji GCC związanych ze znacznikiem GTY imo wykraczałoby poza zakres tego konkretnego pytania i odpowiedzi.
Arne Mertz,
30
(())sama w sobie nie jest magią GCC. Pozwala na przekazanie tekstu zawierającego przecinki do makra jako pojedynczego argumentu. Dla dowolnego kompilatora C / C ++.
Drew Dormann
45

Ogólnie rzecz biorąc, jest używany z makrami do ochrony przecinków. Biorąc pod uwagę #define foo(a,b), wywołanie makra foo(1,2,3)byłoby nielegalne. Użycie dodatkowej pary nawiasów wyjaśnia, który przecinek jest chroniony: w foo((1,2),3)porównaniu foo(1,(2,3)).

W tym przypadku GTYmoże przyjmować wiele argumentów oddzielonych przecinkami, ale wszystkie te przecinki muszą być osłonięte. Dlatego wewnętrzne ()otaczają wszystkie argumenty.

MSalters
źródło
2
Czy możesz wyjaśnić, dlaczego ktoś powinien skorzystać z takiego połączenia?
swaechter
5
Np. #define PRINT_A_LOT(a,b) printf("prefix\n"); printf a; printf("infix\n"); printf b; printf("suffix\n");(W C ++ są oczywiście ładniejsze rozwiązania niż makra).
MSalters
@Albertus: byłoby również miło, gdybyś przekazał szablony do makra Macro((Pair<int, int>), ...). Chociaż następnie uruchomić w dodatkowe kłopoty pozbycie nawiasie w makro
BeniBela