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

  • dope2111

    dope2111

    29 HAZİRAN 2009
  • GoldgenieOfficial

    GoldgenieOff

    23 Temmuz 2009
  • Phandroid

    Phandroid

    26 Ocak 2009