C++對某些特性的貶斥

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,也許我們不曾因爲這些簡陋的寫法而陷入過重大的代碼危機。但從現在,我打算改正這些,讓這些東西在我的代碼庫中永遠消失,不是因爲別的,只爲表明一個態度,我對我自己的作品與代碼如同我的孩子,我會高質量、精心的照顧他們。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章