Ich habe die Header-Dateien meines MSP430-Mikrocontrollers durchsucht und bin auf Folgendes 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 typisiert jmp_buf
, aber ich kann nicht herausfinden, wofür das [1]
ist. Ich weiß, dass es jmp_buf
sich um ein Array mit einem Mitglied (dieser anonymen Struktur) handelt, aber ich kann mir nicht vorstellen, wofür es verwendet wird. Irgendwelche Ideen?
c
struct
reverse-engineering
declaration
typedef
Alexander - Monica wieder einsetzen
quelle
quelle
Antworten:
Dies ist ein gängiger Trick, um einen "Referenztyp" in C zu erstellen, bei dem die Verwendung als Funktionsargument dazu führt, dass sich das einzelne Elementarray zu einem Zeiger auf sein erstes Element verschlechtert, ohne dass der Programmierer den
&
Operator explizit verwenden muss , um seine Adresse abzurufen. Wo deklariert, handelt es sich um einen echten Stapeltyp (keine dynamische Zuordnung erforderlich), aber wenn die aufgerufene Funktion als Argument übergeben wird, erhält sie einen Zeiger darauf, keine Kopie, sodass sie kostengünstig übergeben wird (und von der aufgerufenen Funktion mutiert werden kann, wenn nichtconst
).GMP verwendet denselben Trick für seinen
mpz_t
Typ und ist dort von entscheidender Bedeutung, da die Struktur einen Zeiger auf dynamisch zugewiesenen Speicher verwaltet. Diempz_init
Funktion basiert darauf, einen Zeiger auf die Struktur zu erhalten, keine Kopie davon, oder sie konnte sie überhaupt nicht initialisieren. In ähnlicher Weise können viele Vorgänge die Größe des dynamisch zugewiesenen Speichers ändern, und das würde nicht funktionieren, wenn sie die Struktur des Aufrufers nicht mutieren könnten.quelle
=
.typedef
. Ja, dies ad-hoc zu tun wäre ein bisschen schrecklich, aber wenn Sie einen leicht undurchsichtigen Typ haben, bei dem der API-Benutzer nie über Referenz- oder Nicht-Referenz-Semantik nachdenken muss (es sollte immer als Referenz übergeben werden), ist dies ein vernünftiger Weg Hinzufügen einer automatischen Referenzsemantik zu einer Sprache, der sie sonst fehlt. Es funktioniert sogar, wenn der Benutzer seine eigenen APIs schreibt, die den Typ erhalten, da in C die Erklärung, dass Sie ein Array als Argument akzeptieren, wirklich bedeutet, dass Sie einen Zeiger akzeptieren. alles "funktioniert einfach".... otherwise lacks it
ist das Grobe daran. Die Einschränkungen von C, nicht die Problemumgehung selbst*
im Code zu suchen .