Was ist das (( ))?

90

Beim Durchsuchen des Quellcodes des gcc-Compilers (gcc / c-family / c-pragma.c) sehe ich:

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

und unabhängig davon, ob ich viele Jahre C-Programmierung hinter mir habe, sind diese Teile (())mir noch völlig unbekannt. Kann jemand bitte erklären, was sie bedeuten? Google scheint es nicht zu finden.

Ferenc Deak
quelle
Und was ist das GTY? Es ist nicht im Sprachstandard definiert. Sehen Sie Ihren Code.
Alexey Frunze
7
ist GTY ein Makro ???
Anshul
1
Sie können es bei Google finden, indem Sie die Site in der GTY site:gcc.gnu.org
Abfragezeichenfolge

Antworten:

81

Sie sind GCC-interne "Magie", dh Teil der Compiler-Implementierung selbst.

Siehe diese Seite, die über ihre Verwendung spricht. Das Makro wird verwendet, um Typen für die Speicherbereinigung zu markieren. Es kann auch Argumente geben. Weitere Informationen finden Sie auf dieser Seite .

UPDATE :: Wie Drew Dorman in einem Kommentar hervorhob, sind die tatsächlichen Doppelklammern nicht Teil der "Innerlichkeit" der GNU-Implementierung. Sie werden häufig verwendet, wenn Sie eine ganze Liste von Argumenten in einem einzigen Argument für das aufgerufene Makro zusammenfassen möchten. Dies kann manchmal auch beim Wickeln nützlich sein printf(). Weitere Informationen zu dieser Technik finden Sie in dieser Frage .

entspannen
quelle
5
@Krishnabhadra Erklärung finden Sie auf der verlinkten Seite. Eine weitere Erläuterung der GCC-Funktionen im Zusammenhang mit dem GTY-Marker imo würde den Rahmen dieser speziellen Frage und Antwort sprengen.
Arne Mertz
30
(())selbst ist keine gcc Magie. Damit kann ein Text, der Kommas enthält, als einzelnes Argument an ein Makro übergeben werden. Für jeden C / C ++ - Compiler.
Drew Dormann
45

Im Allgemeinen wird es mit Makros verwendet, um Kommas abzuschirmen. Angesichts #define foo(a,b)dessen foo(1,2,3)wäre der Makroaufruf illegal. Durch die Verwendung eines zusätzlichen Klammerpaars wird klargestellt, welches Komma abgeschirmt ist: foo((1,2),3)versus foo(1,(2,3)).

In diesem Fall GTYkann das mehrere durch Kommas getrennte Argumente annehmen, aber alle diese Kommas müssen abgeschirmt sein. Deshalb ()umgibt das Innere alle Argumente.

MSalters
quelle
2
Können Sie erklären, warum jemand einen solchen Anruf verwenden sollte?
Swaechter
5
ZB #define PRINT_A_LOT(a,b) printf("prefix\n"); printf a; printf("infix\n"); printf b; printf("suffix\n");(In C ++ gibt es natürlich bessere Lösungen als Makros).
MSalters
@ Albertus: wäre auch schön, wenn du Vorlagen an ein Makro übergeben würdest Macro((Pair<int, int>), ...). Obwohl Sie dann in zusätzliche Schwierigkeiten geraten,
entfernen Sie