Kesimpulan akhir: aritmatika pada a void*
adalah ilegal di C dan C ++.
GCC memungkinkannya sebagai ekstensi, lihat Aritmatika pada void
- dan Function-Pointer (perhatikan bahwa bagian ini adalah bagian dari bab "C Extensions" pada manual). Dentang dan ICC kemungkinan memungkinkan void*
aritmatika untuk tujuan kompatibilitas dengan GCC. Kompiler lain (seperti MSVC) melarang aritmatika aktif void*
, dan GCC melarangnya jika -pedantic-errors
flag ditentukan, atau jika -Werror-pointer-arith
flag ditentukan (flag ini berguna jika basis kode Anda juga harus dikompilasi dengan MSVC).
The C Standard Speaks
Kutipan diambil dari draft n1256.
Deskripsi standar tentang status operasi penjumlahan:
6.5.6-2: Sebagai tambahan, kedua operan harus memiliki tipe aritmatika, atau satu operan harus menjadi pointer ke tipe objek dan yang lainnya harus memiliki tipe integer.
Jadi, pertanyaannya di sini adalah apakah void*
pointer ke "tipe objek", atau setara, apakah void
"tipe objek". Definisi untuk "tipe objek" adalah:
6.2.5.1: Jenis dipartisi menjadi tipe objek (tipe yang sepenuhnya menggambarkan objek), tipe fungsi (tipe yang menggambarkan fungsi), dan tipe tidak lengkap (tipe yang menggambarkan objek tetapi kurang informasi yang dibutuhkan untuk menentukan ukurannya).
Dan standar didefinisikan void
sebagai:
6.2.5-19: void
Jenis ini terdiri dari sekumpulan nilai kosong; ini adalah tipe tidak lengkap yang tidak dapat diselesaikan.
Karena void
ini adalah tipe yang tidak lengkap, itu bukan tipe objek. Karenanya itu bukan operan yang valid untuk operasi penambahan.
Karena itu Anda tidak dapat melakukan aritmatika pointer pada void
pointer.
Catatan
Awalnya, ia berpikir bahwa void*
aritmatika diizinkan, karena bagian-bagian dari standar C ini:
6.2.5-27: Sebuah pointer ke void harus memiliki persyaratan representasi dan perataan yang
sama dengan pointer ke tipe karakter.
Namun,
Representasi yang sama dan
persyaratan penyelarasan dimaksudkan untuk menyiratkan interchangeability sebagai argumen untuk fungsi, mengembalikan nilai dari fungsi, dan anggota serikat pekerja.
Jadi ini berarti yang printf("%s", x)
memiliki arti yang sama apakah x
memiliki tipe char*
atau void*
, tetapi itu tidak berarti bahwa Anda dapat melakukan aritmatika pada a void*
.
Catatan editor: Jawaban ini telah diedit untuk mencerminkan kesimpulan akhir.