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

當(dāng)前g++版本中如果需要顯示這些警告需要的加上-Wconversion才會(huì)顯示(-Wall中也沒(méi)有包含,體外話,-Wall 是 Warnning all的縮寫(xiě))
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
C++/STL實(shí)現(xiàn)判斷平面內(nèi)兩條線段的位置關(guān)系代碼示例
這篇文章主要介紹了C++/STL實(shí)現(xiàn)判斷平面內(nèi)兩條線段的位置關(guān)系代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11
C++中類的三種訪問(wèn)權(quán)限解析:private、public與protect
這篇文章主要介紹了C++中類的三種訪問(wèn)權(quán)限解析:private、public與protect,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
c++中strcpy函數(shù)在VS2015無(wú)法使用的問(wèn)題
這篇文章主要介紹了c++中strcpy函數(shù)在VS2015無(wú)法使用的問(wèn)題,具有一定的參考價(jià)值,有需要的可以了解一下。2016-11-11
C語(yǔ)言統(tǒng)計(jì)輸入字符各個(gè)字母出現(xiàn)頻率的解題思路
這篇文章主要介紹了C語(yǔ)言統(tǒng)計(jì)輸入字符各個(gè)字母出現(xiàn)頻率的解題思路,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2015-08-08
C語(yǔ)言實(shí)現(xiàn)兩個(gè)變量值交換的三種方式
兩個(gè)變量值的交換是編程中最常見(jiàn)的問(wèn)題之一,以下將介紹三種變量的交換方式,其中第一種方式是最常用也是最實(shí)用的,后兩種方式一般只在特殊限制下使用,需要的朋友可以參考下2025-03-03

