şey:
struct MyStruct;
ileri referans denir. Tamamlanmamış bir tip oluşturur ve derleyiciye bu ismin bir türü olacağını söyler (ve bu bir yapı - aynı şekilde sendikalar için çalışır) ve detaylar "daha sonra takip et". Böyle bir türden, türü tamamlayana kadar değişkenleri tanımlayamazsınız.
typedef struct MyStruct MyType;
Sadece bu yapı olacak tür adını tanımlar. Bu hala eksik bir tiptir.
MyType *my_t_pointer;
struct MyStruct *my_s_pointer;
tam deklarasyon sağladıklarında bir yapı aynı türden nesnelere işaretçileri olması için yararlıdır, "tamamlayarak" tipi:
Ancak, eksik bir türe bir işaretçi alabilir :
struct MyStruct {
struct MyStruct *next;
};
Aslında bu liste, ağaç ve diğer tüm özyinelemeli veri yapıları için düğüm oluşturmak için tek yoldur. Bu C programlarının (bazen gizli) önemli bir parçasıdır. Ayrıca, bu mekanizma uygulama ayrıntılarını gizlemek için kullanılır. Üstbilgideki işlevlerin yalnızca yapının işaretçiyi almak/iletmek için var olduğunu bilmesi gerekir. Bu işlevlerin kullanılmasının yapının ayrıntılarını bilmesine gerek yoktur (ancak bu şekilde onu ayıramaz, böylece modül yapının ayrıntılarını bilmesi gereken tüm yönleri kapsamalıdır). Tam beyan sadece modülün uygulama dosyasında yer almaktadır.Onlar basit bir şekilde bilinmeyen olarak Bu işaretçileri yapının alanlarını erişmek yani tek "bakmak" olamaz gibi "opak" denir.
my_module.h:
struct MyStruct;
extern void my_init(struct MyStruct *obj);
my_module.c:
struct MyStruct {
int f1;
...
};
my_init(struct MyStruct *obj)
{
...
}
Cı yapıları nominal bir çeviri birimi içinde, yani tip kimlik adıyla belirlenir yazılır; 'struct name' yeni bir tür bildirmek için yeterlidir, ancak başka bir tam bildirim (aka tanımı) ile karşılaşılana kadar, bu tür eksik olacaktır; Tamamlanmamış türde nesneler için işaretçiler olabilir, ancak açıkça üyelere erişemez veya değişkenleri bildirmek için kullanamazsınız; eksik bir tip beyannamesi de ileri bir beyan olarak bilinir; bir tanesi opak isaretçilerdir – Christoph
@Michael Heidelberg "Hepimiz C'deki bir yapının nasıl bildirileceğini biliyoruz" - sorunuzdan sonra bunun doğru olduğundan emin değilim. :) –