首頁 > 後端開發 > C++ > C 靜態初始化順序慘敗的編譯和連結期間會發生什麼?

C 靜態初始化順序慘敗的編譯和連結期間會發生什麼?

DDD
發布: 2024-12-11 01:00:10
原創
769 人瀏覽過

What Happens During Compilation and Linking in the C   Static Initialization Order Fiasco?

靜態初始化順序失敗

「靜態初始化順序失敗」(SIOF)是指使用靜態資料時可能發生的潛在問題C 程式中的成員。當多個來源檔案定義具有循環依賴關係的靜態資料成員時,就會出現這種情況。

考慮以下範例:

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

// file2.cpp
extern int x;
int y = x + 1;
登入後複製

問題:

基於在給定的程式碼片段上,您能解釋一下編譯期間可能發生的以下步驟嗎?連結?

  1. 在 file1.cpp 中,編譯器是否分配儲存並初始化 y?
  2. 在 file1.cpp 中,編譯器是否為 x 分配儲存?
  3. 在file2.cpp中,編譯器是否分配儲存並初始化x?
  4. 在file2.cpp中,編譯器是否為y?
  5. 連結過程中,如果先初始化 file2.o,x 是否會初始化為 0?

答案:

依照C標準(3.6.2「非本地物件的初始化」),以下步驟發生:

  1. 步驟1:零初始化: x 和 y在任何其他初始化之前都進行零初始化。
  2. 步驟 2:動態初始化: 標準沒有指定先初始化哪個變數(x 或 y)。其中一個變數將初始化為值 1,因為它存取另一個變數的零初始化值。
  3. 第 3 步:第二個變數的動態初始化: 其餘變數會動態初始化,取得值為2。
  4. 因此,第五個問題的答案是,x 未初始化為 0 值。

以上是C 靜態初始化順序慘敗的編譯和連結期間會發生什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板