Was ist das (( ))?

Lesezeit: 2 Minuten

Benutzeravatar von Ferenc Deak
Ferenc Deak

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

Benutzeravatar von unwind
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


Benutzeravatar von MSalters
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

    – BeniBela

    21. Februar 2013 um 13:46 Uhr

1419940cookie-checkWas ist das (( ))?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy