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.
GTY
? Nie jest zdefiniowane w standardzie językowym. Zobacz swój kod.GTY site:gcc.gnu.org
Odpowiedzi:
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 .źródło
(())
sama w sobie nie jest magią GCC. Pozwala na przekazanie tekstu zawierającego przecinki do makra jako pojedynczego argumentu. Dla dowolnego kompilatora C / C ++.Ogólnie rzecz biorąc, jest używany z makrami do ochrony przecinków. Biorąc pod uwagę
#define foo(a,b)
, wywołanie makrafoo(1,2,3)
byłoby nielegalne. Użycie dodatkowej pary nawiasów wyjaśnia, który przecinek jest chroniony: wfoo((1,2),3)
porównaniufoo(1,(2,3))
.W tym przypadku
GTY
może przyjmować wiele argumentów oddzielonych przecinkami, ale wszystkie te przecinki muszą być osłonięte. Dlatego wewnętrzne()
otaczają wszystkie argumenty.źródło
#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).Macro((Pair<int, int>), ...)
. Chociaż następnie uruchomić w dodatkowe kłopoty pozbycie nawiasie w makro