Saya mengintip melalui file header mikrokontroler MSP430 saya, dan saya menemukan ini di <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 */
Saya mengerti bahwa itu mendeklarasikan struct anonim dan typedef itu ke jmp_buf
, tetapi saya tidak tahu untuk apa [1]
. Saya tahu itu mendeklarasikan jmp_buf
sebagai array dengan satu anggota (dari struct anonim ini), tetapi saya tidak dapat membayangkan untuk apa itu digunakan. Ada ide?
c
struct
reverse-engineering
declaration
typedef
Alexander - Kembalikan Monica
sumber
sumber
Jawaban:
Ini adalah trik umum untuk membuat "tipe referensi" di C, di mana menggunakannya sebagai argumen fungsi menyebabkan larik elemen tunggal terdegradasi ke penunjuk ke elemen pertamanya tanpa pemrogram perlu secara eksplisit menggunakan
&
operator untuk mendapatkan alamatnya. Di mana dideklarasikan, ini adalah tipe tumpukan nyata (tidak diperlukan alokasi dinamis), tetapi ketika diteruskan sebagai argumen, fungsi yang dipanggil menerima penunjuk ke sana, bukan salinan, jadi itu diteruskan dengan murah (dan dapat dimutasi oleh fungsi yang dipanggil jika tidakconst
).GMP menggunakan trik yang sama dengan
mpz_t
tipenya, dan sangat penting di sana, karena struktur mengelola penunjuk ke memori yang dialokasikan secara dinamis; yangmpz_init
fungsi bergantung pada mendapatkan pointer ke struktur, bukan salinan itu, atau tidak bisa menginisialisasi sama sekali. Demikian pula, banyak operasi dapat mengubah ukuran memori yang dialokasikan secara dinamis, dan itu tidak akan berfungsi jika mereka tidak dapat mengubah struct pemanggil.sumber
=
.typedef
seperti ini. Ya, melakukan ad-hoc ini akan sangat buruk, tetapi jika Anda memiliki jenis yang agak buram, di mana pengguna API tidak perlu memikirkan tentang semantik referensi vs. non-referensi (harus selalu melewati referensi), itu adalah cara yang masuk akal menambahkan semantik referensi otomatis ke bahasa yang tidak memiliki bahasa tersebut. Ia bahkan bekerja jika pengguna menulis API mereka sendiri yang menerima tipe, karena di C, menyatakan Anda menerima sebuah array sebagai argumen berarti Anda menerima sebuah pointer; semuanya "berjalan lancar".... otherwise lacks it
yang menjijikkan tentang itu. Batasan C, bukan solusi itu sendiri*
dalam kode.