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
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 :-)
Bellek Python bir yapı boyutu...
Proje CocoaPods Yapı Hataları...
Program aracılığıyla ekran versiyonu/i...
Neden't bir yapı her üyenin boyut...
Proje 21.0.1 için yapı araçları yüksel...