C 中的靜態物件需要注意的幾個問題

2021-06-01 23:11:41 字數 989 閱讀 8384

1.無論何時設計乙個包含靜態變數的函式,都需要注意多執行緒問題

2.靜態物件(包括區域性靜態物件和全域性靜態物件)的析構函式在程式從main中退出,或者是標準的c庫函式exit被呼叫時才呼叫。多數情況下main函式的結尾也是呼叫exit來結束程式的,這就意味著在析構函式內部使用exit函式是很危險的,因為這樣會導致無窮的的遞迴呼叫。但如果用標準的c庫函式abort來退出程式,靜態物件的析構函式並不會呼叫

3.可以用標準c庫函式atexit來指定當程式跳出mian,或呼叫exit時應執行的操作。在這種情況下,在跳出main或者呼叫exit之前,用atexi()t註冊的函式可以在所有的物件的析構函式呼叫之前被呼叫

4.和普通物件的銷毀一樣,靜態物件的銷毀也是按照與初始化相反的順序進行的

5.靜態全域性變數是內部鏈結的,內部鏈結的好處是可以將這個東西放在乙個標頭檔案中而不用擔心鏈結時發生衝突。一般來說,放在標頭檔案中的名字,如常量、內聯函式、在預設情況下都是內部鏈結的

注:常量在c中預設是外部鏈結的,在c++中預設是內部鏈結,如果想讓const量變成外部鏈結,需要加extern,並且在定義時如果沒有賦初值,則這個「定義」實際上是乙個申明

6.所有的全域性物件都是隱含為靜態儲存的(存放在靜態儲存區),如果不使用static關鍵字,則這個全域性物件對所有的翻譯單元都是可見的

檔案作用域的int a=0等同於extern int a=0,都是定義乙個外部連線性的靜態資料區成員

檔案作用域的static int a=0,是定義乙個內部連線性的靜態資料區成員

extern void f()等同於void f()

所以需要注意「static」與「靜態」多種對映,對於在檔案作用域的全域性變數以及函式,static是改變其可見性,而對於區域性變數,static改變的是儲存型別

7.與static既能應用於全域性變數也能應用於區域性變數不同,關鍵字auto和register都只能應用於區域性變數,不過這兩個關鍵字都有點多餘,因為編譯器總是能從變數定義時的上下文判斷出這是乙個區域性變數,並且編譯器在優化**方面也做得很好

幾個C 需要注意的小地方

1 引用在宣告時必須要定義 2 auto不能自動推導引用,需要顯式宣告 3 可以顯示定義預設的建構函式和析構函式,需要在後面加 default關鍵字 4 static 關鍵字標示的成員變數必須在類外定義 5 const關鍵字標示的成員變數可以在初始化列表或者類外定義 但不能宣告定義 6 計算機會自動...

Object c block需要注意的幾點問題

摘自 date 2015 12 4 1.block定義 1 說明 a.block是oc中的一種資料型別,在ios開發中被廣泛使用 b.是block的特有標記 c.block的實現 包含在 之間 d.大多情況下,以內聯inline函式的方式被定義和使用 e.block與c語言的函式指標有些相似,但使用...

編寫shell程式 指令碼時需要注意的幾個問題

在實際工作中運用shell程式時,總結的幾個經常忽視的問題,如果不注意很可能導致一些麻煩事 判斷使用者的屬性,比如uid gid,甚至是使用者名稱 使用者互動 能不互動就不互動吧,鬼知道使用者會輸入什麼 另一方面,加強正規表示式的學習,一般用來作輸入邊界測試很好用 注意程式的可維護性,能函式化的語句...