C++的靜態(tài)類型檢查詳解
什么時候引進的?
在帶類的C的時候,引進了靜態(tài)(“強”)類型檢查。
bjarne在《The Design and Evolution of C++ 》介紹:
在經(jīng)歷過Simula和Algol68的經(jīng)驗之后,靜態(tài)類型檢查對于我而言已經(jīng)是一種必需品,唯一的問題是如何把它加進來
一個有趣的觀察
學過帶類的C(或C++)的程序員竟喪失了尋找由于簡單類型錯誤而造成的運行錯誤的能力。由于他們逐漸習慣于依賴帶類的C(或C++)所提供的類型檢查和類型轉(zhuǎn)換,甚至喪失了快速地發(fā)現(xiàn)某些愚蠢錯誤的能力,而這些錯誤是由于缺乏檢查而混進C程序的。進而他們也不能為避免這種愚蠢錯誤而采取預防措施,而好的C程序員則會把這些看作是理所當然的事情(好的C程序員牛B)。
當習慣了某種便利時,如果便利突然消失,將不知多措。
窄轉(zhuǎn)換
C語言中沒有對類型轉(zhuǎn)換做任何檢查;考慮如下代碼
void f()
{
long int lng = 65000;
int i1 = lng; // i1 becomes negative -536 on machines with 16 bit ints
int i2 = 257;
char c = i2; // truncates: c becomes 1 on machines with 8 bit chars
}
當bjarne起初嘗試禁止所有不能保持值不變的轉(zhuǎn)換,也就是說,只要想把一個大的對象存儲到較小的對象里,就要求明顯地寫出轉(zhuǎn)換運算符:
void g(long lng, int i)
{
int i1 = lng; // error: narrowing conversion
i1 = (int)lng; // truncates for 16 bit ints
char c = i; // error: narrowing conversion
c = (char)i; // truncates
}
這個試驗失敗得很慘。因為檢查了每個C程序都包含大量從int到char變量的賦值(都是正常工作的程序,絕大數(shù)必然是安全的);在帶類的C的團體中,沒有人希望這樣背離C語言。所以無法禁止所有不能保持值不變的轉(zhuǎn)換。那還有什么彌補的措施嗎? 有,編譯器警告。
警告的使用
當發(fā)現(xiàn)C語言里那些我認為極端嚴重而不能忽略的弱點,但這些弱點又因為在C語言的結(jié)構(gòu)里根深蒂固而無法去除。就讓C++的編譯系統(tǒng)發(fā)出警告。
例如:
int main()
{
double d = 3.14;
int k = d;
char c = k;
return 0;
}
編譯:
g++ main.cpp -Wconversion -o main

當前g++版本中如果需要顯示這些警告需要的加上-Wconversion才會顯示(-Wall中也沒有包含,體外話,-Wall 是 Warnning all的縮寫)
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內(nèi)容!
相關文章
C++實現(xiàn)LeetCode(12.整數(shù)轉(zhuǎn)化成羅馬數(shù)字)
這篇文章主要介紹了C++實現(xiàn)LeetCode(12.整數(shù)轉(zhuǎn)化成羅馬數(shù)字),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-07-07
詳解數(shù)據(jù)結(jié)構(gòu)C語言實現(xiàn)之循環(huán)隊列
在我們生活中有很多隊列的影子,可以說與時間相關的問題,一般都會涉及到隊列問題;本文詳細介紹了如何使用C語言實現(xiàn)循環(huán)隊列,下面一起來看看。2016-07-07
C語言實現(xiàn)直角坐標轉(zhuǎn)換為極坐標的方法
這篇文章主要介紹了C語言實現(xiàn)直角坐標轉(zhuǎn)換為極坐標的方法,涉及C語言進行三角函數(shù)與數(shù)值運算相關操作技巧,需要的朋友可以參考下2017-09-09

