Was ist der Zweck davon [1] am Ende der Struct-Deklaration?

Lesezeit: 3 Minuten

Alexanders Benutzeravatar
Alexander

Ich habe die Header-Dateien meines MSP430-Mikrocontrollers durchsucht und bin auf diese gestoßen <setjmp.h>:

/* r3 does not have to be saved */
typedef struct
{
    uint32_t __j_pc; /* return address */
    uint32_t __j_sp; /* r1 stack pointer */
    uint32_t __j_sr; /* r2 status register */
    uint32_t __j_r4;
    uint32_t __j_r5;
    uint32_t __j_r6;
    uint32_t __j_r7;
    uint32_t __j_r8;
    uint32_t __j_r9;
    uint32_t __j_r10;
    uint32_t __j_r11;
} jmp_buf[1]; /* size = 20 bytes */

Ich verstehe, dass es eine anonyme Struktur deklariert und es zu Typedef macht jmp_bufaber ich kann nicht herausfinden, was die [1] ist für. Ich weiß, es erklärt jmp_buf ein Array mit einem Mitglied (dieser anonymen Struktur) zu sein, aber ich kann mir nicht vorstellen, wofür es verwendet wird. Irgendwelche Ideen?

  • Hat vielleicht etwas damit zu tun, dass man in einen Zeiger zerfällt?

    – Elazar

    2. November 2017 um 23:55 Uhr

  • Der letzte Kommentar scheint völlig falsch zu sein …

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    3. November 2017 um 16:21 Uhr

Benutzeravatar von ShadowRanger
ShadowRanger

Dies ist ein gängiger Trick, um einen “Referenztyp” in C zu erstellen, bei dem die Verwendung als Funktionsargument dazu führt, dass das Array mit einem einzelnen Element zu einem Zeiger auf sein erstes Element degradiert wird, ohne dass der Programmierer die explizit verwenden muss & Betreiber, um seine Adresse zu erhalten. Wo deklariert, ist es ein echter Stack-Typ (keine dynamische Zuordnung erforderlich), aber wenn es als Argument übergeben wird, erhält die aufgerufene Funktion einen Zeiger darauf, keine Kopie, sodass es billig übergeben wird (und kann von der aufgerufenen Funktion verändert werden, wenn dies nicht der Fall ist const).

Den gleichen Trick bedient GMP mit seinen mpz_t type, und dort ist es kritisch, weil die Struktur einen Zeiger auf dynamisch zugewiesenen Speicher verwaltet; das mpz_init Die Funktion ist darauf angewiesen, einen Zeiger auf die Struktur zu erhalten, keine Kopie davon, oder sie konnte sie überhaupt nicht initialisieren. In ähnlicher Weise können viele Operationen die Größe des dynamisch zugewiesenen Speichers ändern, und das würde nicht funktionieren, wenn sie die Struktur des Aufrufers nicht ändern könnten.

  • Es verhindert auch das Kopieren über =.

    – Melpomen

    2. November 2017 um 23:57 Uhr

  • Das ist eklig. Ich werde diese Antwort akzeptieren, sobald die Mindestzeit abgelaufen ist. Danke für Ihre Hilfe!

    – Alexander

    2. November 2017 um 23:57 Uhr

  • @Alexander: Es ist nicht ganz so eklig, wenn es über a gekapselt wird typedef so was. Ja, dies ad hoc zu tun, wäre irgendwie schrecklich, aber wenn Sie einen leicht undurchsichtigen Typ haben, bei dem der API-Benutzer nie über Referenz- und Nicht-Referenz-Semantik nachdenken muss (es sollte stets als Referenz übergeben), ist dies eine vernünftige Möglichkeit, einer Sprache automatische Referenzsemantik hinzuzufügen, der sie ansonsten fehlt. Es funktioniert sogar, wenn der Benutzer seine eigenen APIs schreibt, die den Typ empfangen, denn in C bedeutet das Deklarieren, dass Sie ein Array als Argument akzeptieren, wirklich, dass Sie einen Zeiger akzeptieren; alles “funktioniert einfach”.

    – ShadowRanger

    3. November 2017 um 0:07 Uhr


  • @ShadowRanger Es ist ein cleverer Trick, aber ... otherwise lacks it ist das eklige daran. Die Einschränkungen von C, nicht die Problemumgehung selbst

    – Alexander

    3. November 2017 um 0:12 Uhr


  • IMO ist es ekelhaft. Als ich das erste Mal mit GMP arbeitete, konnte ich nicht verstehen, wie es funktionierte, da die Zahlen anscheinend als Wert übergeben wurden. Ich musste in die GMP-Header graben, um es zu enträtseln. Es fliegt einfach ins Gesicht von Leuten, die C bereits kennen. Dann müssen Sie im Kopf behalten, welche Parameter als Wert übergeben werden und welche Referenzen sind, anstatt nur nach einem zu suchen * im Code.

    – MM

    3. November 2017 um 0:37 Uhr

1420690cookie-checkWas ist der Zweck davon [1] am Ende der Struct-Deklaration?

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

Privacy policy