日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C++的靜態類型檢查詳解_C 語言

作者:summer_sunrise ? 更新時間: 2022-04-25 編程語言

什么時候引進的?

在帶類的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

欄目分類
最近更新