2011-05-28 24 views
7

Ben aşağıdaki örnekte olduğu gibi bir birlik initialize global olarak çalışılıyor: kodu çalıştırırsanız, temp.i veya temp.t [o ne dikkat edeceğiz, ancakSendika başlatma

#include <cstdio> 

typedef union { 
    char t[4]; 
    int i; 
} a; 

enum { 
    w = 5000, 
    x, 
    y, 
    z 
}; 

a temp = {w}; 
int main() { 
    printf("%d %d %d %d %d\n", temp.t[0],temp.t[1],temp.t[2],temp.t[3],temp.i); 
    return 0; 
} 

...] aslında sendika ile başlatılan doğru öğeyi verir. Tamsayı üyeyi el ile başlatabilirsem, bunun önüne geçileceğini düşünürdüm ama ne yazık ki yapamam. Yapıdaki elemanların sırasını değiştiremiyorum (int ve char sırasını değiştirerek her şeyi düzgün bir şekilde başlatıyor) - aslında bir dış kütüphane tarafından sağlanıyorlar. Soruma şudur: char [4] üyesinden ziyade global yapısının tamsayı üyesini nasıl ayarlayabilirim (veya bu durumda, yalnızca char [] öğesinin ilk öğesi)?

DÜZENLEME: Ayrıca, bu soruna kesinlikle C++ çözüm var mı? yani, adlandırılmış struct initialisation'ın çalışmadığı bir yer (dilde mevcut olmadığı için)?

cevap

7

Bunu yapmak isteyeyim:

a temp = { .i=w }; 
+0

Ah güzellik; aradığım şey buydu. Alkışlar –

+3

Bunun standart olmayan bir dil uzantısı olduğunu ve diğer derleyicilere geçtiğinizde bunun başarısız olacağını unutmayın. –

+0

Evet, bu yüzden gcc/g ++ 'dan bahsetmiştim. Sendika üyelerini başlatmak için geçerli bir C++ yöntemi görünmemektedir. – evgeny

11

C99 bunu yapabilirsiniz:

a temp = { 
    .i = w 
}; 
6

Böyle tamsayı üyesini ilklendirebilirsiniz

a temp = {i: w}; 

That should Hem gcc hem de g++ için çalışın.

7

C99 nda olduğu gibi başlatma adlı kullanımını yapabilirsiniz:

a x = { .i = 10 }; 

Orada standart dışı gcc uzantısını kullanmak için bazı öneri, ancak C kodlama eğer bunu önleyeceğini:

a x = { i : 10 }; 

Sen başlatmak için bir işlev kullanabilirsiniz: sonra

inline a initialize(int value) { // probably choose a better name 
    a tmp; 
    tmp.i = value; 
    return a; 
} 

ve kullanımı:

a x = initialize(10); 

Derleyici, kopyaları uzaklaştıracak. Eğer C++ yapıyorsanız

, kendi sendikası türü için bir kurucu sağlayabilir:

/*typedef*/ union u {   // typedef is not required in general in C++ 
    char bytes[sizeof(int)]; 
    int i; 
    u(int i = 0) : i(i) {} 
} /*u*/; 

u x(5); 
+0

Sorun, sendikanın kendisini değiştiremem, aksi takdirde sadece elemanları yeniden düzenlerim ve onunla işim biter. Yine de satır içi yaklaşımı seviyorum. –