C++的靜態(tài)類(lèi)型檢查詳解
什么時(shí)候引進(jìn)的?
在帶類(lèi)的C的時(shí)候,引進(jìn)了靜態(tài)(“強(qiáng)”)類(lèi)型檢查。
bjarne在《The Design and Evolution of C++ 》介紹:
在經(jīng)歷過(guò)Simula和Algol68的經(jīng)驗(yàn)之后,靜態(tài)類(lèi)型檢查對(duì)于我而言已經(jīng)是一種必需品,唯一的問(wèn)題是如何把它加進(jìn)來(lái)
一個(gè)有趣的觀察
學(xué)過(guò)帶類(lèi)的C(或C++)的程序員竟喪失了尋找由于簡(jiǎn)單類(lèi)型錯(cuò)誤而造成的運(yùn)行錯(cuò)誤的能力。由于他們逐漸習(xí)慣于依賴(lài)帶類(lèi)的C(或C++)所提供的類(lèi)型檢查和類(lèi)型轉(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ì)類(lèi)型轉(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ù)必然是安全的);在帶類(lèi)的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語(yǔ)言入門(mén)篇--定義宏#define的概述
本篇文章是C語(yǔ)言系列基礎(chǔ)篇,適合c語(yǔ)言剛?cè)腴T(mén)的朋友,本文對(duì)關(guān)于c語(yǔ)言的定義宏#define作了簡(jiǎn)要的概述,希望可以幫助大家快速入門(mén)c語(yǔ)言的世界,更好的理解c語(yǔ)言2021-08-08C++實(shí)現(xiàn)LeetCode(12.整數(shù)轉(zhuǎn)化成羅馬數(shù)字)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(12.整數(shù)轉(zhuǎn)化成羅馬數(shù)字),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07C語(yǔ)言實(shí)現(xiàn)倒置字符串的兩種方法分享
這篇文章主要和大家詳細(xì)介紹了利用C語(yǔ)言實(shí)現(xiàn)倒置字符串的兩種方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起動(dòng)手嘗試一下2022-08-08詳解數(shù)據(jù)結(jié)構(gòu)C語(yǔ)言實(shí)現(xiàn)之循環(huán)隊(duì)列
在我們生活中有很多隊(duì)列的影子,可以說(shuō)與時(shí)間相關(guān)的問(wèn)題,一般都會(huì)涉及到隊(duì)列問(wèn)題;本文詳細(xì)介紹了如何使用C語(yǔ)言實(shí)現(xiàn)循環(huán)隊(duì)列,下面一起來(lái)看看。2016-07-07C語(yǔ)言實(shí)現(xiàn)直角坐標(biāo)轉(zhuǎn)換為極坐標(biāo)的方法
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)直角坐標(biāo)轉(zhuǎn)換為極坐標(biāo)的方法,涉及C語(yǔ)言進(jìn)行三角函數(shù)與數(shù)值運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2017-09-09C++中實(shí)現(xiàn)線程安全和延遲執(zhí)行詳解
這篇文章主要為大家詳細(xì)介紹了C++中實(shí)現(xiàn)線程安全和延遲執(zhí)行的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的小伙伴可以了解下2024-01-01C語(yǔ)言掃雷游戲的簡(jiǎn)單實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言掃雷游戲的簡(jiǎn)單實(shí)現(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11