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.
GTY
? Es ist nicht im Sprachstandard definiert. Sehen Sie Ihren Code.GTY site:gcc.gnu.org
Antworten:
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 .quelle
(())
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.Im Allgemeinen wird es mit Makros verwendet, um Kommas abzuschirmen. Angesichts
#define foo(a,b)
dessenfoo(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)
versusfoo(1,(2,3))
.In diesem Fall
GTY
kann das mehrere durch Kommas getrennte Argumente annehmen, aber alle diese Kommas müssen abgeschirmt sein. Deshalb()
umgibt das Innere alle Argumente.quelle
#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).Macro((Pair<int, int>), ...)
. Obwohl Sie dann in zusätzliche Schwierigkeiten geraten,