SORU
2 Mart 2015, PAZARTESİ


C'In diğer unsuru boyutu dayalı Birliği öğe boyutu

Kod: aşağıdaki parça düşünün

struct S
{
    union
    {
        int arr1[10];
        char arr2[sizeof(arr1)];
    };
};

Başarıyla c 03 c 11 modunda 4.9.2 gcc ile derler. S gibi şablon olarak değiştirdiğimde ancak:

template <size_t N>
struct S
{
    union
    {   
        int arr1[N];
        char arr2[sizeof(arr1)];
    };  
};

Şu hata çıktısını alıyorum:

error: int S<10ul>::<anonymous union>::arr1 [10]’ is inaccessible

int arr1[N];

error: within this context

char arr2[sizeof(arr1)];

Çınlama c 11 modunda her iki sürümü de derler. Ne doğru davranış burada olduğunu merak ediyorum. arr2 sizeof(int) * N olduğunu açıkça belirtmelidir ben belki?

CEVAP
2 Mart 2015, PAZARTESİ


Sendika anonim. Böylece, derleyici arr1 ve sınıf düzeyinde arr2 oluşturur.
Bu, char arr2[sizeof(arr1)]; arr1 düzgün bakın olmaz çünkü.

İşte bir çözüm :

template <size_t N>
struct S
{
    union A
    {   
        int arr1[N];
        char arr2[sizeof(arr1)];
    };  
};

Derler burada : https://ideone.com/JcvOYg

Birliği belirtilerek, doğrudan dahil derleyici engelleyebiliriz. Sonra arr1 düzgün bir şekilde almak mümkün.

Ama arr1 arr2 S'nin üyeleri artık değil. bu da demek oluyor

Son olarak, Members can be defined in terms of other members ama ikincisi "" derleyici tarafından. kolay bulunabilir olmalı

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bart Baker

    Bart Baker

    1 Aralık 2006
  • bombjack2991

    bombjack2991

    29 HAZİRAN 2008
  • Chip Johnson

    Chip Johnson

    30 AĞUSTOS 2007