Yapı bildiriminin sonundaki bu [1] 'in amacı nedir?


96

MSP430 mikrodenetleyicimin başlık dosyalarında geziniyordum ve bununla karşılaştım <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 */

Anonim bir yapı ilan ettiğini anlıyorum ve typedef bunun için jmp_buf, ama ne işe yaradığını anlayamıyorum [1]. jmp_bufBir üyeli (bu anonim yapının) bir dizi olduğunu bildirdiğini biliyorum , ancak ne için kullanıldığını hayal edemiyorum. Herhangi bir fikir?


5
İşaretçiye dönüşmekle ilgili bir şey olabilir mi?
Elazar

3
Son yorum tamamen yanlış görünüyor ...
R .. GitHub BUZA YARDIM ETMEYİ DURDUR

Yanıtlar:


117

Bu, C'de bir "başvuru türü" oluşturmak için yaygın bir püf noktasıdır; burada, bunu bir işlev bağımsız değişkeni olarak kullanmak, programcının &adresini almak için operatörü açıkça kullanmasına gerek kalmadan tek öğe dizisinin ilk öğesine bir göstericiye indirgenmesine neden olur . Bildirildiği yerde, bu gerçek bir yığın türüdür (dinamik ayırma gerekmez), ancak bir argüman olarak iletildiğinde, çağrılan işlev bir kopya değil, ona bir işaretçi alır, bu nedenle ucuza aktarılır (ve değilse çağrılan işlev tarafından değiştirilebilir. const).

GMP, mpz_ttürü ile aynı numarayı kullanır ve burada kritiktir, çünkü yapı dinamik olarak ayrılmış belleğe bir işaretçi yönetir; mpz_initfonksiyon bunun, yapısına değil bir kopyasını bir işaretçi alma dayanıyor, yoksa tüm adresten başlatamadı. Benzer şekilde, birçok işlem dinamik olarak ayrılmış belleği yeniden boyutlandırabilir ve arayanın yapısını değiştiremezlerse bu işe yaramaz.


12
Ayrıca, üzerinden kopyalamayı da engeller =.
melpomene

11
Bu iğrenç. Bu yanıtı minimum süre geçtikten sonra kabul edeceğim. Yardımınız için teşekkürler!
İskender - Eski Monica

3
@Alexander: Böyle bir şekilde kapsüllendiğinde o kadar da iğrenç değil typedef. Evet, bunu anlık olarak yapmak çok kötü olurdu, ancak API kullanıcısının referans veya referans olmayan anlamlar hakkında asla düşünmesine gerek olmayan ( her zaman referansla geçmelidir) hafif opak bir türe sahipseniz , bu makul bir yoldur aksi halde eksik olan bir dile otomatik referans semantiğinin eklenmesi. Kullanıcı, türü alan kendi API'lerini yazarsa bile çalışır, çünkü C'de, bir diziyi argüman olarak kabul ettiğinizi bildirmek, gerçekten bir gösterici kabul ettiğiniz anlamına gelir; her şey "sadece çalışır".
ShadowRanger

4
@ShadowRanger Bu akıllıca bir numara, ama ... otherwise lacks itiğrenç olan bu. C'nin sınırlamaları, geçici çözümün kendisi değil
Alexander - Monica'yı

34
IMO iğrenç. GMP ile ilk kez çalışırken, sayılar görünüşte değer bazında geçtiği için nasıl çalıştığını anlayamadım. Bunu çözmek için GMP başlıklarına girmem gerekiyordu. Sadece C'yi gerçekten bilen insanların karşısında uçuyor. O halde *, kodda sadece bir tane aramak yerine, hangi parametrelerin değere göre geçirildiğini ve hangilerinin referans olduğunu aklınızda tutmanız gerekir .
MM
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.