Rumah > Artikel > pembangunan bahagian belakang > Bagaimana untuk Menjamin Permulaan yang Betul bagi Pembolehubah Global dalam C dengan Ketergantungan?
Tertib Permulaan Global C: Meneroka Ketergantungan
Dalam C , pembolehubah global dalam unit terjemahan biasanya dimulakan mengikut susunan yang diisytiharkan. Walau bagaimanapun, kekeliruan boleh timbul apabila mempertimbangkan susunan permulaan merentas berbilang unit terjemahan.
Senario Masalah Permulaan
Pertimbangkan kod berikut:
<code class="cpp">struct Foo { Foo() { printf("Foo::Foo()\n"); } void add() { printf("Foo::add()\n"); } static int addToGlobal() { globalFoo.add(); return 0; } }; Foo globalFoo; int dummy = Foo::addToGlobal(); int main() { printf("main()\n"); return 0; }</code>
Dengan kod ini, output yang dijangkakan ialah:
Foo::Foo() Foo::addToGlobal() START Foo::add() Foo::addToGlobal() END main()
Walau bagaimanapun, menukar pengisytiharan dan permulaan dummy dan globalFoo menghasilkan output yang berbeza:
Foo::addToGlobal() START Foo::add() Foo::addToGlobal() END Foo::Foo() main()
Perintah Permulaan dan Ketergantungan
Tingkah laku ini menunjukkan bahawa susunan permulaan pembolehubah global mengabaikan kebergantungan. Dalam kes ini, panggilan ke Foo::addToGlobal() cuba mengakses kaedah Foo sebelum pembinanya dipanggil.
Penyelesaian: Memastikan Permulaan yang Betul
Untuk memastikan bahawa pembina Foo dipanggil sebelum dummy dimulakan, kita boleh mentakrifkan globalFoo sebelum dummy dalam unit terjemahan yang sama. Ini menjamin bahawa globalFoo akan dimulakan terlebih dahulu, membolehkan addToGlobal() berjaya mengakses kaedahnya.
Penyelesaian Alternatif: Pengawal Permulaan Statik
Sebagai alternatif, kami boleh memperkenalkan statik pengawal permulaan dalam Foo::addToGlobal():
<code class="cpp">static Foo* pFoo = nullptr; if (pFoo == nullptr) { pFoo = &globalFoo; } pFoo->add();</code>
Semakan ini memastikan bahawa penunjuk pFoo dimulakan ke globalFoo sebelum mengakses kaedahnya, dengan berkesan menghalang penggunaan globalFoo secara pramatang.
Atas ialah kandungan terperinci Bagaimana untuk Menjamin Permulaan yang Betul bagi Pembolehubah Global dalam C dengan Ketergantungan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!