C 全域性變數建構函式的呼叫

2021-06-21 07:45:40 字數 817 閱讀 4572

c++是不能在全域性scope裡寫表示式, 原來一直以為指令的執行都是在main函式裡的. 但c++裡可以呼叫類的建構函式對類初始化. 建構函式顯然不能是在main函式裡呼叫, 那在什麼時候呼叫呢? 

是在一段叫做init的**段裡.

linux的elf可執行檔案格式分為若干段:

elf可執行檔案格式

elf header

segment header table

.init        初始化段

.text       **段

.rodata  唯讀資料(常量等)

.data     可讀寫資料(全域性變數等)

.bss       未初始化資料    

.symtab  符號表(似乎只有全域性的吧)

.debug    除錯資訊

.line        指令和原始檔行對應

.strtab     符號字串實際存放處

section header table

在可執行程式載入時, 在呼叫main函式之前, 會依次呼叫其他東西:

call __libc_init_first

call _init

call atexit

call main

call _exit

而全域性變數的初始化**, 就是在init段裡的.

另外,  在呼叫全域性建構函式的時候, 還會順便呼叫atexit把需要在結束時呼叫的全域性析構函式安裝上. 由於atexit允許安裝多個函式(按安裝的反序執行). 所以不會跟elf載入時在main前面呼叫的那次atexit衝突.

c 全域性變數 靜態全域性變數

全域性變數是靜態儲存方式,靜態全域性變數也是靜態儲存方式,這兩者在儲存方式上並無不同。區別 雖在於非靜態全域性變數的作用域是整個源程式,當乙個源程式由多個原始檔組成時,靜態全域性變數在各個原始檔中都是有效的。靜態區域性變數則限制了其作用域,只在定義該變數的原始檔內有效,在同一源程式的其它原始檔中不能...

python全域性變數的呼叫

背景 在寫介面測試用例的時候,涉及到後續介面需要用到登入後的使用者cookies資訊。於是想將在使用者登入後儲存這個cookies,設定為全域性的變數,其他的用例在setup中去獲取使用者cookie以達到目的。實現方案 單獨定義個處理global的模組,其他需要用到該變數的地方去匯入模組。在set...

javer學c 全域性函式, 全域性變數

extern 全域性c c 中函式預設就是全域性的,變數寫在函式外的話預設也是全域性的.global.cpp,定義乙個全域性變數和乙個全域性函式 c include using namespace std int g int 10 void globalmethod 全域性函式的宣告需要使用exte...