SORU
6 Mart 2014, PERŞEMBE


C uzanan bir yapı

Geçenlerde buna benzeyen bir meslektaşının kodu rastladım:

typedef struct A {
  int x;
}A;

typedef struct B {
  A a;
  int d;
}B;

void fn(){
  B *b;
  ((A*)b)->x = 10;
}

Onun açıklaması struct A struct B ilk üye olduğu zamandan beri bu kadar b->x b->a.x olarak aynı olacak ve daha iyi okunabilirlik sağlar.
Bu mantıklı, ama bu iyi bir uygulama olarak kabul edilir? Ve bu platformlarda çalışır? Şu anda bu güzel GCC çalışır.

CEVAP
6 Mart 2014, PERŞEMBE


Evet, çapraz platform çalışır, ama bu değilmutlakabu iyi bir fikir.

ISO C standardı (tüm alıntılar aşağıda C11 muaftır) başı olarak, 6.7.2.1 Structure and union specifiers /15, doldurma izin verilmezöncebir yapının ilk elemanı

Ayrıca, 6.2.7 Compatible type and composite type olan devletler

İki tür kendi türleri aynı ise uyumlu bir tipi var

A A-within-B türleri aynı olduğu tartışmasız.

Bunun anlamı bellek erişimi için A alanları aynı olmayacak. hem A B türleri, ki bu daha mantıklı b->a.x ki muhtemelen negerekireğer gelecekte sürdürülebilirliği hakkında herhangi bir endişeniz varsa kullanıyor.

Ve, normalde sıkı tür aliasing hakkında endişelenmenize gerek olacak olsa da, burada da geçerlidir inanmıyorum.diğer işaretçiler standart yasadışı olan özel durum.

6.5 Expressions /7 Bu istisnalar bazı Dipnot ile belirtilmiştir:

Bu listenin amacı hangi bir nesne olabilir ya da yumuşatılmış olmayabilir bu şartlar belirtmektir.

Özel durumlar listelenmiştir:

  • a type compatible with the effective type of the object;
  • bizi burada ilgilendiren gerekmez bazı diğer istisnalar; ve
  • an aggregate or union type that includes one of the aforementioned types among its members (including, recursively, a member of a subaggregate or contained union).

Yapı doldurma kuralları yukarıda da eklenince, bu cümle de dahil olmak üzere:

Yapısı bir nesne için bir işaretçi, uygun dönüştürülmüş, ilk üyesi olduğunu gösteriyor

bu örnek gösteriyor özellikle için izin verilir. Burada hatırlamamız gereken temel nokta ifade türü ((A*)b) A*, B* değil. Bu değişkenler sınırsız yumuşatma amaçlı uyumlu hale getirir.

Bunu daha önce de yanıldım standardının ilgili bölümleri, benim okuma(a)ama sanmam bu durumda.

Eğer varsa, birgerçekbunun için gereken, kodu herhangi bir kısıtlamaları belgeleyen olurdum ama iyi çalışacaktırçokgelecekte ısırıldığı için yapılar bulunur.


(a)Eşim gibi, daha sık ve daha sormadan :-)

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • AndroidSale

    AndroidSale

    17 NİSAN 2011
  • CrazyMan

    CrazyMan

    14 Mayıs 2008
  • Neil Cicierega

    Neil Ciciere

    22 Mart 2006