網站首頁 編程語言 正文
什么時候引進的?
在帶類的C的時候,引進了靜態(“強”)類型檢查。
bjarne在《The Design and Evolution of C++ 》介紹:
在經歷過Simula和Algol68的經驗之后,靜態類型檢查對于我而言已經是一種必需品,唯一的問題是如何把它加進來
一個有趣的觀察
學過帶類的C(或C++)的程序員竟喪失了尋找由于簡單類型錯誤而造成的運行錯誤的能力。由于他們逐漸習慣于依賴帶類的C(或C++)所提供的類型檢查和類型轉換,甚至喪失了快速地發現某些愚蠢錯誤的能力,而這些錯誤是由于缺乏檢查而混進C程序的。進而他們也不能為避免這種愚蠢錯誤而采取預防措施,而好的C程序員則會把這些看作是理所當然的事情(好的C程序員牛B)。
當習慣了某種便利時,如果便利突然消失,將不知多措。
窄轉換
C語言中沒有對類型轉換做任何檢查;考慮如下代碼
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起初嘗試禁止所有不能保持值不變的轉換,也就是說,只要想把一個大的對象存儲到較小的對象里,就要求明顯地寫出轉換運算符:
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變量的賦值(都是正常工作的程序,絕大數必然是安全的);在帶類的C的團體中,沒有人希望這樣背離C語言。所以無法禁止所有不能保持值不變的轉換。那還有什么彌補的措施嗎? 有,編譯器警告。
警告的使用
當發現C語言里那些我認為極端嚴重而不能忽略的弱點,但這些弱點又因為在C語言的結構里根深蒂固而無法去除。就讓C++的編譯系統發出警告。
例如:
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的縮寫)
總結
原文鏈接:https://blog.csdn.net/uestcyms/article/details/123036782
相關推薦
- 2022-04-18 numpy中np.nanmax和np.max的區別及坑_python
- 2022-05-10 在 VSCode 中如何設置默認的瀏覽器為Chrome或Firefox
- 2022-07-22 git提交代碼設置某些文件不可上傳
- 2022-04-02 .Net使用SuperSocket框架實現WebSocket前端_實用技巧
- 2023-01-01 React路由動畫切換實現過程詳解_React
- 2022-04-27 .Net?Core中使用MongoDB搭建集群與項目實戰_基礎應用
- 2022-08-05 Entity?Framework主從表的增刪改_C#教程
- 2022-08-26 詳解WPF雙滑塊控件的使用和強制捕獲鼠標事件焦點_C#教程
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支