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, dass ich viele C-Programmierjahre hinter mir habe, diese Bits: (()) sind mir noch völlig unbekannt. Kann jemand bitte erklären, was sie bedeuten? Google scheint es nicht zu finden.
Und was ist das GTY? Es ist nicht im Sprachstandard definiert. Siehe deinen Code.
– Alexey Frunze
15. Februar 2013 um 8:57 Uhr
ist GTY ein Makro???
– Anshul
15. Februar 2013 um 8:59 Uhr
Sie können es bei Google finden, indem Sie die Website wie folgt in der Abfragezeichenfolge angeben:GTY site:gcc.gnu.org
– Ericsson
20. Februar 2013 um 1:38 Uhr
entspannen
Sie sind GCC-interne “Magie”, dh Teil der Compiler-Implementierung selbst.
Sehen diese Seite die über ihre Verwendung spricht. Das Makro wird verwendet, um Typen für Garbage-Collection-Zwecke zu markieren. Es kann auch Argumente geben, siehe diese Seite für Details.
AKTUALISIEREN:: Wie Drew Dorman in einem Kommentar betonte, sind die eigentlichen doppelten Klammern nicht Teil der “Internalität” 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 beim Verpacken nützlich sein, z printf(), zu. Weitere Informationen zu dieser Technik finden Sie in dieser Frage.
Eine @Krishnabhadra-Erklärung finden Sie auf der verlinkten Seite. Weitere Erläuterungen zu den GCC-Funktionen im Zusammenhang mit dem GTY-Marker imo würden den Rahmen dieser speziellen Frage und Antwort sprengen.
– Arne Mertz
15. Februar 2013 um 9:06 Uhr
(()) selbst ist nicht gcc-Magie. Es ermöglicht, dass ein Text, der Kommas enthält, als einzelnes Argument an ein Makro übergeben werden kann. Für jeden C/C++-Compiler.
– Drew Dormann
15. Februar 2013 um 16:36 Uhr
MSalter
Im Allgemeinen wird es mit Makros verwendet, um Kommas abzuschirmen. Gegeben #define foo(a,b)der Makroaufruf foo(1,2,3) wäre illegal. Die Verwendung eines zusätzlichen Klammerpaars verdeutlicht, welches Komma abgeschirmt ist: foo((1,2),3) gegen foo(1,(2,3)).
In diesem Fall ist die GTY kann mehrere durch Kommas getrennte Argumente annehmen, aber alle diese Kommas müssen abgeschirmt werden. Deshalb das Innere () umgeben alle Argumente.
Können Sie erklären, warum jemand einen solchen Aufruf verwenden sollte?
– swächter
15. Februar 2013 um 11:11 Uhr
Z.B #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 schönere Lösungen als Makros).
– MSalter
15. Februar 2013 um 12:52 Uhr
@Albertus: wäre auch schön, wenn du Templates an ein Makro übergibst Macro((Pair<int, int>), ...). Obwohl Sie dann zusätzliche Probleme bekommen, entfernen Sie die Klammer innerhalb des Makros
Und was ist das
GTY
? Es ist nicht im Sprachstandard definiert. Siehe deinen Code.– Alexey Frunze
15. Februar 2013 um 8:57 Uhr
ist GTY ein Makro???
– Anshul
15. Februar 2013 um 8:59 Uhr
Sie können es bei Google finden, indem Sie die Website wie folgt in der Abfragezeichenfolge angeben:
GTY site:gcc.gnu.org
– Ericsson
20. Februar 2013 um 1:38 Uhr