首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 程序啟動順序:全局物件構造早於 main

     編輯:關於C++

現象演示

#include <iostream> #include <cstdlib>
using namespace std;
class A {
public:
    A() { cout << "I come here before main()!" << endl; f(); }
    static void f() { cout << "I come here before main() too!" << endl; }
};
static A a; // 全局靜態物件
int main() {
    cout << "Entering main()!" << endl;
    cout << "Leaving main()!" << endl;
    system("PAUSE");
    return 0;
}

輸出結果

I come here before main()!
I come here before main() too!
Entering main()!
Leaving main()!

原理解析

C++ 標準規定:命名空間作用域的靜態/全局物件在 main 進入前完成構造。static A a; 觸發建構函數,故輸出先於 main。同理,析構函數在 main 返回後、程序退出前執行。

工程啟示

  • 全局物件構造順序跨編譯單元不確定,避免相互依賴。
  • 單例模式常用「函數局部靜態變量」延遲初始化,規避靜態初始化順序災難。
  • 嵌入式/實時系統常禁用全局物件,改用顯式 init() 可控啟動。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved