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

Linda Hamilton
Lepaskan: 2024-11-03 22:56:02
asal
636 orang telah melayarinya

 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>
Salin selepas log masuk

Dengan kod ini, output yang dijangkakan ialah:

Foo::Foo()
Foo::addToGlobal() START
Foo::add()
Foo::addToGlobal() END
main()
Salin selepas log masuk

Walau bagaimanapun, menukar pengisytiharan dan permulaan dummy dan globalFoo menghasilkan output yang berbeza:

Foo::addToGlobal() START
Foo::add()
Foo::addToGlobal() END
Foo::Foo()
main()
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!