Can int (*)[]
tamamlanmamış bir tür olabilir mi?
C 2018 6.2.5 1 diyor ki:
Bir çeviri birimindeki çeşitli noktalarda bir nesne türü eksik (o türdeki nesnelerin boyutunu belirlemek için yeterli bilgiye sahip olmayabilir ) veya tam (yeterli bilgiye sahip) olabilir.
Dolayısıyla, bir türün boyutu biliniyorsa, türün tamamlanmış olduğu görülmektedir. 6.2.6.1 28, belirli işaretçi türlerinin aynı boyutlara sahip olması gerektiğini belirtir (işaretçiler void
ve karakterler, uyumlu türlere işaretçiler, yapılara işaretçiler ve sendikalara işaretçiler), ancak diğer türlere işaretçiler değişebilir.
Tüm işaretçilerin veya dizilerin tüm işaretleyicilerinin int
aynı boyuta sahip olduğu bir C uygulamasında , o zaman boyutu int (*)[]
bilinir, bu yüzden tam olur. Örneğin, büyük diziler için farklı işaretçiler kullanan bir uygulamada, boyut bilinmeyecektir, bu nedenle eksiktir.
Olarak AA işaret , bir yapı 6.7.2.1 Bu işaretçiler bir boyutu olan bir uygulama kabul etmesi gerektiğini göstermektedir 3'te bir kısıtlama başına, nihai esnek dizi elemanı hariç, tam olmayan tip bir üye içermemelidir struct { int (*p)[]; }
bir uygulama farklı olduğu da bu tür diziler için boyutlar bir kısıtlama ihlali teşhisi koymalıdır. (Bu da böyle bir bildirimin kesinlikle C'ye uygun olmadığı anlamına gelir.)
void *
Tamamlanmış olan gerçek, eksik bir türün göstergesinin tamamlanabileceğini gösterir. Eksik bir türün göstergesinin eksik olup olmadığını göstermez. Eğer biri “Bir memeli fil olabilir mi?” Diye sorduysa, “Aslan bir memelidir” diyerek, bir memelinin fil olamayacağını temin etmez. Soru, eksik tipe işaretçi kümesinin X kümesinin eksik bir eleman içerip içermeyeceğini sorar. Eksik tipe işaretçi kümesinin X'in tamamlanmış bir eleman içerdiğini göstermek ilgisizdir.