Bisakah int (*)[]
tipe yang tidak lengkap?
C 2018 6.2.5 1 mengatakan:
Pada berbagai titik dalam unit terjemahan, suatu jenis objek mungkin tidak lengkap (kurang informasi yang cukup untuk menentukan ukuran objek jenis itu) atau lengkap (memiliki informasi yang cukup).
Jadi tampaknya jika ukuran suatu jenis diketahui, jenisnya lengkap. 6.2.6.1 28 menetapkan bahwa jenis pointer tertentu harus memiliki ukuran yang sama (pointer ke void
dan karakter, pointer ke jenis yang kompatibel, pointer ke struktur, dan pointer ke serikat pekerja), tetapi pointer ke jenis lain dapat bervariasi.
Dalam implementasi C di mana semua pointer, atau semua pointer ke array int
, memiliki ukuran yang sama, maka ukuran int (*)[]
diketahui, sehingga akan lengkap. Dalam implementasi yang, katakanlah, menggunakan pointer berbeda untuk array besar, ukurannya tidak akan diketahui, sehingga tidak lengkap.
Seperti yang ditunjukkan MM , struktur tidak boleh mengandung anggota dengan tipe tidak lengkap, kecuali anggota array fleksibel akhir, per kendala dalam 6.7.2.1 3. Ini menunjukkan bahwa implementasi dengan satu ukuran pointer harus menerima struct { int (*p)[]; }
sementara implementasi yang memiliki perbedaan ukuran untuk array tersebut harus mendiagnosis pelanggaran kendala. (Ini pada gilirannya berarti pernyataan semacam itu bukan bagian dari kepatuhan ketat C.)
void *
lengkap menunjukkan bahwa pointer ke tipe yang tidak lengkap bisa lengkap. Itu tidak menunjukkan apakah pointer ke tipe tidak lengkap bisa tidak lengkap. Jika seseorang bertanya "Bisakah mamalia menjadi gajah?", Menunjukkan bahwa "Singa adalah mamalia" tidak akan menyatakan bahwa mamalia tidak bisa menjadi gajah. Pertanyaan bertanya apakah set X dari pointer ke tipe tidak lengkap dapat mengandung elemen yang tidak lengkap. Menunjukkan bahwa set X pointer ke tipe tidak lengkap berisi elemen yang lengkap tidak relevan.