C
Struct ve union
Struct içinde union kullanmayı öğrenirsin.
Struct ve union
Bir struct içine union koyarak tagged union (etiketli birleşim) oluşturursun. Etiket, hangi union üyesinin aktif olduğunu söyler. Bu, güvenli union kullanımının standart desenidir.
Örnek: enum Type { INT_T, FLOAT_T };, union Value { int i; float f; }; ve struct TaggedValue { enum Type type; union Value value; };. tv.type = INT_T; ile etiketi, tv.value.i = 42; ile değeri atarsın. Okurken önce type'a bakar, ona göre doğru üyeyi okursun. Bu desen, veri biçimleri, protokol mesajları ve AST düğümleri için yaygındır.
switch ile tür seçimi
Tagged union'dan güvenli okuma yapmak için switch ile etiketi denetlersin. Her case, ilgili üyeyi okur. Bu, yanlış üye okumayı önler.
Örnek: switch (tv.type) { case INT_T: printf("%d\n", tv.value.i); break; case FLOAT_T: printf("%f\n", tv.value.f); break; }. break koymazsan düşme (fall-through) olur; bu genellikle hatadır. default dalı beklenmeyen etiketleri yakalar. Bu desen, gerçek dünya kodunda tagged union'ların standart okuma biçimidir; yorumlayıcılar ve seri dönüştürücüler bunu kullanır.
Uygulama Tagged union ile yazdır
enum Type { INT_T, FLOAT_T };, union Value { int i; float f; }; ve struct TaggedValue { enum Type type; union Value value; }; tanımla. main içinde struct TaggedValue tv; yaz; tv.type = INT_T; ve tv.value.i = 42; ata. switch (tv.type) ile case INT_T: printf("%d\n", tv.value.i); break; ekle.
Örnek çözümü göster
#include <stdio.h>
enum Type { INT_T, FLOAT_T };
union Value { int i; float f; };
struct TaggedValue { enum Type type; union Value value; };
int main(void) {
struct TaggedValue tv;
tv.type = INT_T;
tv.value.i = 42;
switch (tv.type) {
case INT_T: printf("%d\n", tv.value.i); break;
}
return 0;
}
Kendini test et
-
Tagged union üye erişimi
struct TaggedValue tv;
tv.type = INT_T;
tv.value____ = 42;
Cevabı göster
struct TaggedValue tv;
tv.type = INT_T;
tv.value.i = 42;
-
Tagged union parçalarını eşle
- enum Type type
- Etiket alanı
- union Value value
- Değer alanı
- switch (tv.type)
- Tür seçimi
- tv.value.i
- int üye erişimi
-
Tagged union'da etiket neden kullanılır?
- Derleyici hatası için
- Bellek tasarrufu için
- Daha hızlı erişim için
- Hangi üyenin aktif olduğunu bilmek için
Cevabı göster
Hangi üyenin aktif olduğunu bilmek için — Etiket, hangi union üyesinin aktif olduğunu söyler.
Sıradaki ders: typedef enum