Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah C Menangani Fiasco Perintah Permulaan Statik dalam Senario dengan Ketergantungan Pekeliling?

Bagaimanakah C Menangani Fiasco Perintah Permulaan Statik dalam Senario dengan Ketergantungan Pekeliling?

Patricia Arquette
Patricia Arquetteasal
2024-12-15 04:37:09471semak imbas

How Does C   Handle Static Initialization Order Fiasco in a Scenario with Circular Dependencies?

Perplexity of Static Initialization Order Fiasco

Di alam C , "static initialization order fiasco" (SIOF) boleh memperkenalkan rumit kerumitan ke dalam pemahaman kod. Contoh kod berikut menggambarkan fenomena ini:

// file1.cpp
extern int y;
int x = y + 1;

// file2.cpp
extern int x;
int y = x + 1;

Pertanyaan:

Adakah coretan kod ini mempamerkan ciri-ciri berikut?

  1. Semasa penyusunan file1.cpp, y dibiarkan tanpa dimulakan dan tiada storan diperuntukkan untuknya ia.
  2. Dalam file1.cpp, storan diperuntukkan untuk x, tetapi ia tidak dimulakan.
  3. Semasa penyusunan fail2.cpp, storan diperuntukkan untuk y tetapi tanpa permulaan.
  4. Jika file2.o dimulakan sebelum file1.o semasa pemautan, apakah yang berlaku kepada x? Adakah ia menerima nilai lalai 0 atau kekal tidak dimulakan?

Respons:

Piawaian C (3.6.2 "Inisialisasi objek bukan tempatan" ) memberikan pandangan tentang langkah-langkah permulaan:

  1. Langkah 1: x dan y dimulakan kepada sifar sebelum sebarang permulaan lain berlaku.
  2. Langkah 2: Standard tidak menentukan sama ada x atau y menerima permulaan dinamik dahulu. Walau bagaimanapun, pembolehubah lain akan menerima nilai 1 disebabkan oleh permulaan sifar.
  3. Langkah 3: Permulaan dinamik berlaku untuk pembolehubah yang tinggal, menghasilkan nilai 2.

Oleh itu, jawapan kepada pertanyaan 4 ialah x menerima nilai lalai 0 semasa permulaan.

Atas ialah kandungan terperinci Bagaimanakah C Menangani Fiasco Perintah Permulaan Statik dalam Senario dengan Ketergantungan Pekeliling?. 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