Memahami masalah "kegagalan tertib pemula statik"
Dalam C , pemulaan statik melibatkan pemulaan pembolehubah global dan statik semasa program permulaan. Proses ini boleh membawa kepada gelagat yang tidak dijangka yang dikenali sebagai "statik initialization order fiasco" (SIOF).
Pertimbangkan contoh kod berikut:
// file1.cpp extern int y; int x = y + 1; // file2.cpp extern int x; int y = x + 1;
Dalam contoh ini, pembolehubah x dan y diisytiharkan dalam fail sumber yang berbeza. Mari kita analisa proses penyusunan dan pemautan untuk memahami isu yang berpotensi:
Kompilasi:
Memaut:
Jika fail2.o dipautkan dahulu, perkara berikut berlaku:
Akibat:
Gelagat program bergantung pada susunan fail objek dipautkan. Ini boleh membawa kepada hasil yang tidak dijangka dan tidak konsisten, kerana nilai x dan y boleh berbeza berdasarkan tertib pemautan.
Aturan Piawaian Permulaan:
C standard tidak menyatakan susunan pembolehubah statik dimulakan. Langkah pemulaan mengikut standard adalah seperti berikut:
Dalam contoh di atas, hasilnya ialah kedua-dua x dan y ialah dimulakan kepada nilai yang berbeza (sama ada 1 atau 2) bergantung pada susunan fail objek dipautkan.
Mencegah SIOF:
Untuk mencegah SIOF dan memastikan tingkah laku yang konsisten, adalah disyorkan untuk:
Atas ialah kandungan terperinci Apakah 'Static Initialization Order Fiasco' (SIOF) dalam C , dan bagaimanakah ia boleh dicegah?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!