C 程式設計規範之21 避免跨編譯單元的初始化依賴

2021-06-19 15:49:50 字數 666 閱讀 2220

摘要:

保持順序,不同編譯單元中的名字空間級物件決不應該在初始化上互相依賴,因為其初始化順序是未定義的。這樣做會惹出很多麻煩,輕則在專案中稍做修改就會引發奇怪的崩潰,重則出現嚴重的不可移植問題——即使是同一編譯器的新版本也不行。

在不同的編譯單元中定義兩個名字空間級的物件時,先呼叫哪乙個物件的建構函式是沒有定義的。經常工具可能會碰巧按照編譯單元目標檔案的連線順序初始化,但這種假設並不總是可靠的;即使確實如此,你總不會希望自己的**的正確性難以捉摸地依賴於makefile或者專案檔案吧。

因此,在任何名字空間級物件的初始化**中,不能假設其他編譯單元中定義的任何其他物件都已經初始化了。這些考慮方法也適用於動態初始化的原始型別變數。

請注意,甚至在使用建構函式構造之前,名字空間級物件就已經使用0靜態初始化過了。有些自相矛盾的是,這種零初始化會使錯誤更難以檢查,因為靜態的零初始化不會迅速使程式崩潰,而是使未初始化物件顯現出一種看似合理的表象。你可能認為字串是空的,指標是空的,整數型變數為0,而事實上,**已經費勁地將它們初始化了。

為了避免這一問題,應該盡可能地避免使用名字空間級的變數,它們很危險。如果確實需要可能依賴於另乙個變數的此種變數,可以考慮使用singleton設計模式。使用時要小心一些,可以通過確保物件在第一次訪問時被初始化,來避免隱含的依賴性。singleton本質上也是全域性變數,它會因為相互依賴或者迴圈依賴而被破壞。

C 程式設計規範之16 避免使用巨集

摘要 巨集是c和c 語言的抽象設施中最生硬的工具,它是披著函式外衣的飢餓的狼,很難馴服,它會我行我素地遊走於各處。要避免使用巨集。這一點在effective c 中也進行了解釋。c 的巨集的主要問題在於,他們表面上看起來很好,而實際上做的卻是另一回事。巨集會忽略作用域,忽略型別系統,忽略所有其他的語...

C 程式設計規範之40 要避免提供隱式轉換

摘要 並非所有的變化都是進步。隱式轉換所帶來的影響經常是弊大於利。在為自定義型別提供隱式轉換之前,請三思而行,應該依賴的是顯示轉換。隱式轉換主要有兩個主要的問題 1.它們會在最意料不到的地方丟擲異常。2.他們併步總是能與語言的其他元素有效地配合。隱式轉換建構函式與過載機制配合得很糟糕,而且會使不可見...

C 程式設計規範之29 考慮過載,以避免隱式型別轉換

摘要 如無必要勿增物件 因素型別轉換提供了語法上的便利。但是如果建立臨時物件的工作並不不要而且適於優化,那麼可以提供簽名與常見引數型別精確匹配的過載函式,而且不會導致轉換。隱式轉換最常見的例子是字串的比較,見如下程式 class string booloperator const string co...