Saya harus mendefinisikan tipe data 24-bit. Saya menggunakan char[3]
untuk mewakili tipe. Dapatkah saya typedef char[3]
ke type24
? Saya mencobanya dalam contoh kode. Saya memasukkan typedef char[3] type24;
file header saya. Kompiler tidak mengeluh tentang hal itu. Tetapi ketika saya mendefinisikan fungsi void foo(type24 val) {}
dalam file C saya, itu memang mengeluh. Saya ingin dapat mendefinisikan fungsi seperti type24_to_int32(type24 val)
bukan type24_to_int32(char value[3])
.
210
type24 foo
, apa yang akan menjadi ukuran, jenis, dan makna darifoo
,*foo
,**foo
,&foo
, dan&&foo
? Sudahkah makna dan legalitas ekspresi semacam itu berubah selama bertahun-tahun?Kamu ingin
Deklarasi tipe C aneh seperti itu. Anda meletakkan jenis persis di mana nama variabel akan pergi jika Anda mendeklarasikan variabel jenis itu.
sumber
Dari jawaban R .. :
Pengguna yang tidak melihat bahwa itu adalah sebuah array kemungkinan besar akan menulis sesuatu seperti ini (yang gagal):
Ini akan dikompilasi dengan peringatan berikut:
Dan menghasilkan output sebagai berikut:
sumber
Array tidak dapat dilewatkan sebagai parameter fungsi dengan nilai dalam C.
Anda bisa meletakkan array di struct:
dan kemudian berikan nilai, tapi tentu saja itu kurang nyaman untuk digunakan:
x.byte[0]
alih-alihx[0]
.Fungsi Anda
type24_to_int32(char value[3])
sebenarnya dilewati oleh pointer, bukan oleh nilai. Ini persis sama dengantype24_to_int32(char *value)
, dan3
diabaikan.Jika Anda senang melewati pointer, Anda bisa tetap menggunakan array dan melakukan:
Ini akan melewatkan pointer-to-array, bukan pointer-to-first-element, jadi Anda menggunakannya sebagai:
Saya tidak yakin itu benar-benar keuntungan, karena jika Anda tidak sengaja menulis
value[1]
maka sesuatu yang bodoh terjadi.sumber
decay
suatu tempat (dan mungkin dengan menunjukkan bahwa situasi lebih buruk untuk kembali array - yang tidak bekerja sama sekali).Untuk menggunakan tipe array dengan benar sebagai argumen fungsi atau parameter templat, buat struct sebagai ganti typedef, lalu tambahkan
operator[]
ke struct agar Anda dapat menjaga fungsionalitas array seperti:sumber
char&
tidakoperator[]
ada hal-hal yang ada dalam C.Berikut adalah contoh singkat mengapa array typedef dapat membingungkan tidak konsisten. Jawaban lain memberikan solusi.
Ini menghasilkan output
karena type24 sebagai parameter adalah pointer. (Dalam C, array selalu diberikan sebagai pointer.) Kompiler gcc8 akan mengeluarkan peringatan secara default, untungnya.
sumber