Saya menekan beberapa kode c di kernel Linux:
static struct ctl_table ip_ct_sysctl_table[] = {
{
.procname = "ip_conntrack_max",
.maxlen = sizeof(int),
.mode = 0644,
.proc_handler = proc_dointvec,
},
// ...
{
.procname = "ip_conntrack_log_invalid",
.maxlen = sizeof(unsigned int),
.mode = 0644,
.proc_handler = proc_dointvec_minmax,
.extra1 = &log_invalid_proto_min,
.extra2 = &log_invalid_proto_max,
},
{ }
};
Di sini array struct berakhir dengan { }
. Untuk tujuan apa ditambahkan?
By the way, sedikit di atas kode ini ada array struct lain , tetapi tanpa kawat gigi kosong di akhir.
Kapan saya harus menggunakan kawat gigi kosong di akhir array struct?
c
arrays
struct
linux-kernel
Sel NK
sumber
sumber
-pedantic
.Jawaban:
Perubahan khusus ini adalah bagian dari jaring sysctl: Hapus kode sysctl biner yang tidak digunakan yang dilakukan oleh Eric W. Biederman, mengubah inisialisasi elemen terakhir
ip_ct_sysctl_table
array dari{0}
menjadi{}
(dan melakukan perubahan yang mirip dengan banyak inisialisasi array lainnya).The
{0}
pola tampaknya telah sekitar untuk lebih lama lagi meskipun, dan kedua{0}
atau{}
akhir elemen-inisialisasi umumnya (dalam kode sumber Linux) secara eksplisit disebut sebagaiTerminating entry
, sehingga kemungkinan hadiah pola untuk memungkinkan mengkonsumsi array ini tanpa mengetahui panjang mereka, mengakhiri konsumsi saat menekan entri terminasi yang diinisialisasi nol. Misalnya untuk array yang sama dalamsound/aoa/fabrics/snd-aoa-fabric-layout.c
maksud inisialisasi nol bahkan secara eksplisit disebutkan dalam komentar, misalnya:sumber
int arr[] = {}
(mengingat bahwa kita menggunakan ekstensi initializer kosong GNU) menghasilkan array kosong; yaitu, ukuranarr
makhluk0
?{ initializer-list }
kemudian daftar penginisialisasi:designation(opt) initializer
atauinitializer-list , designation(opt) initializer
Anda mungkin terbiasa dengan string tanpa-penghentian nol.
ctl_table ip_ct_sysctl_table[]
adalah array yang diakhiri nol, yaitu entri array terakhir memiliki semua anggota nol.sumber
procname
nol, ataumaxlen
nol.procname
bisachar[100]
dalam hal ini""
, bukan nol. Tetapi sebaliknya ya.Agar lebih jelas: "kurung kosong '{}' di akhir array struct" tidak diperlukan untuk memenuhi persyaratan sintaksis C.
Ketika kode menginginkan nilai sentinel .
Terkadang berguna bagi program untuk memiliki elemen array final dari semua nol - tentu saja untuk mendeteksi akhirnya. The perlu datang dari penggunaan aplikasi array
ctl_table ip_ct_sysctl_table[]
, bukan dari kebutuhan bahasa C.sumber
Ini adalah nol elemen yang diinisialisasi pada akhir array untuk meningkatkan jumlah elemen array dengan satu.
Pertimbangkan demo kecil ini:
Ukuran
arr
array akan berubah jika Anda menghapus tanda komentar{}
pada akhir daftar inisialisasi array.Output:
Dengan
// {}
(array memiliki 2 elemen)Dengan
{}
(array memiliki 3 elemen)Penjelasan lebih lanjut:
The
ip_ct_sysctl_table
array hanya digunakan di satu tempat, yang ada di sini:Ekstra
{}
meningkatkan ukuran totalip_ct_sysctl_table
.sumber
{ }
penginisialisasi. Namun mengapa masih belum jelas. Jadi, untuk sekarang, kata mungkin adalah mungkin ide yang baik. :)