網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
什么時(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ì)象里,就要求明顯地寫出轉(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的縮寫)
總結(jié)
原文鏈接:https://blog.csdn.net/uestcyms/article/details/123036782
相關(guān)推薦
- 2022-03-16 .net6環(huán)境下使用RestSharp請(qǐng)求GBK編碼網(wǎng)頁(yè)亂碼的解決方案_實(shí)用技巧
- 2022-05-28 C語(yǔ)言?超詳細(xì)講解鏈接器_C 語(yǔ)言
- 2022-07-07 python中列表對(duì)象pop()方法的使用說(shuō)明_python
- 2022-04-05 報(bào)錯(cuò):Can‘t locate Debian/Debhelper/Dh_Lib.pm in @INC
- 2022-07-08 python?csv實(shí)時(shí)一條一條插入且表頭不重復(fù)問(wèn)題_python
- 2022-11-17 獲取C++變量類型的簡(jiǎn)單方法_C 語(yǔ)言
- 2022-12-01 Golang打印復(fù)雜結(jié)構(gòu)體兩種方法詳解_Golang
- 2022-07-31 Windows使用cmd命令行查看、修改、刪除與添加環(huán)境變量_DOS/BAT
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支