SORU
25 Ocak 2011, Salı


Ne zaman herkes bir Birliği kullanmak istiyorsunuz? Temelde C tek gün yaşıyorduk.

Ben hala gerçekten sendikalar alamadım. Anlayabiliyorum yani. Ben her C veya C metin onları tanıtır (bazen geçen), ama bunların kullanımı çok az pratik örnekler veya ilgili bölge veya kullanmasına izin eğilimindedir. Ne zaman sendikalar ve hatta modern eski bir durumda yararlı olacaktır? Benim sadece iki tahminime göre programlama mikroişlemciler zaman çok sınırlı alanı ile çalışmak, ya da ne zaman sen gelişmekte olan bir API falan ve istediğiniz zorlamak son kullanıcı için tek bir örneğinin birkaç nesne/türleri tek bir seferde. Bu iki tahmin bile yakın. Biri bana açıklayabilir mi?

CEVAP
25 Ocak 2011, Salı


Sendikalar genellikle bir ayırıcısını şirketi ile kullanılır. bir değişken Birliği alanlarında geçerli olduğunu belirten. Örneğin, diyelim ki Variant kendi türü oluşturmak istediğiniz dediler

struct my_variant_t {
    int type;
    union {
        char char_value;
        short short_value;
        int int_value;
        long long_value;
        float float_value;
        double double_value;
        void* ptr_value;
    };
};

O zaman bu gibi kullanabilirsiniz:

/* construct a new float variant instance */
void init_float(struct my_variant_t* v, float initial_value) {
    v->type = VAR_FLOAT;
    v->float_value = initial_value;
}

/* Increments the value of the variant by the given int */
void inc_variant_by_int(struct my_variant_t* v, int n) {
    switch (v->type) {
    case VAR_FLOAT:
        v->float_value  = n;
        break;

    case VAR_INT:
        v->int_value  = n;
        break;
    ...
    }
}

Bu aslında oldukça yaygın bir deyim, özellikle Visual Basic iç.

Gerçek bir örnek SDL görmek içinSDL_Event union ... . (actual source code here). Birliğin başında type bir alan var, ve aynı alanda SDL_*her Olay bir yapı üzerinde tekrarlanır. O zaman, doğru bir olay işlemek için type alanın değerini kontrol etmeniz gerekir.

Avantajları basit: gereksiz bellek kullanmadan tüm olay türlerini işlemek için tek bir veri türü vardır.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Alan Fullmer

    Alan Fullmer

    3 EYLÜL 2010
  • Austin Evans

    Austin Evans

    5 AĞUSTOS 2007
  • Blunty

    Blunty

    13 Mart 2006