0. 問題的引入
一直覺得我的3dlib裡面的.h檔案的這段**很彆扭:
namespace _cppyin_3dlib
彆扭在全域性變數的定義這裡。
我希望所有#include這個標頭檔案的程式,能夠訪問這3個全域性變數。但如果不加上static就會出現重複定義的情況。
其實大家都知道另外乙個方法也可以解決,就是把他們定義在.cpp檔案裡,而在.h裡面放上extern字首做他們的宣告。
但是我就是愛鑽死牛角尖,這兩種方式到底哪種好呢?於是我又翻了幾本書,把聯結器相關的知識又複習了一遍,其中tcpl中說了這麼一句話:「在c/c++程式裡,關鍵字static也被(混亂的)用於表示使用內部連線。請不要使用static,除了在函式和類的內部」。
作者對於static來表示內部連線的做法是極其反對的,這也引來了我對「貶斥特徵」的學習。
1. 什麼是貶斥特徵?
c++標準化委員會通過「貶斥某個特徵」表達了他們的一種期望——這個特徵應該靠邊站。雖然某些特徵是多餘或極其危險的,委員會也無權去刪除c中已有的特徵。那麼他們只有「貶斥」他們,並用態度來表明,程式設計師絕對不應該使用他們。
上面static的用法,就是被貶斥的一種之一。
2. 一些被貶斥特徵的例項
1) c++貶斥用static表示「區域性編譯單位」的用法,用無名命名空間來替代。
2) 隱式地將字串字面量轉換到非const的char*也受到貶斥。
3) 對c風格的強制轉換是貶斥態度,在所有需要轉換型別的地方,都應該使用static_cast、reinterpret_cast、const_cast或者他們的組合。
3. 總結
我們的**裡一定存在string str = "somestr";我們的**裡一定有int i = int(1.2 + 3);可能是我們覺得沒有必要,可能是我們實在懶的去寫static_cast,也許我們不曾因為這些簡陋的寫法而陷入過重大的**危機。但從現在,我打算改正這些,讓這些東西在我的**庫中永遠消失,不是因為別的,只為表明乙個態度,我對我自己的作品與**如同我的孩子,我會高質量、精心的照顧他們。
C 對C語言的非物件導向特性擴充 2
include int add int x,int y int main int add int x,int y 不過也可以採用簡潔的方式來宣告,如 int add add 都可以通過編譯 但是在c 裡,如果函式定義在後,呼叫在前,那函式原型的宣告必須是int add int x,int y 函式名...
C 多型特性中對析構函式的理解
要使用多型特性時,基類析構函式需要加上virtual關鍵字,呼叫對基類指標的delete時才會發生動態繫結,使派生類的析構函式也能夠被呼叫到,否則只呼叫的基類的析構函式,沒有呼叫派生類的析構函式,導致記憶體洩漏。基類析構函式宣告virtual不是必需的,若確定不需要使用到基類指標指向派生類的多型特性...
通過json對控制項的某些狀態做持久化
json格式 struct window 將從檔案中的json格式內容解析到字段中 void window parse const json value v if isvaluevalid value,toolboxoffset if isarrayvalid value,panels 將字段儲存到...