Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Menjamin Permulaan yang Betul bagi Pembolehubah Global dalam C dengan Ketergantungan?

Bagaimana untuk Menjamin Permulaan yang Betul bagi Pembolehubah Global dalam C dengan Ketergantungan?

Linda Hamilton
Linda Hamiltonasal
2024-11-03 22:56:02631semak imbas

 How to Guarantee Proper Initialization of Global Variables in C   with Dependencies?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn