0. 問題的引入
一直覺得我的3DLIB裏面的.h文件的這段代碼很彆扭:
彆扭在全局變量的定義這裏。
我希望所有#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,也許我們不曾因爲這些簡陋的寫法而陷入過重大的代碼危機。但從現在,我打算改正這些,讓這些東西在我的代碼庫中永遠消失,不是因爲別的,只爲表明一個態度,我對我自己的作品與代碼如同我的孩子,我會高質量、精心的照顧他們。