為什麼 C 的庫函式中頻繁使用 typedef?

時間 2021-05-09 09:41:16

1樓:熊爸爸科技工坊

很簡單,道理有兩個

乙個是取別名,方便移植,比如long型在不同cpu中位數可能不同,早期的64位,現在的128位,將來可能是256位或者1024位,使用typdef把資料型別重新命名後,要移植的時候只要針對CPU把資料型別定義改一下就好了,是不是很方便,這也是老外開發者一直強調的不要使用魔法數字的變形,減少硬編碼就是給自己減少麻煩。

第二是方便理解,比如unsigned int會用typedef重新命名成uint8,uint16,uint32等等,這樣一看就知道是什麼型別,方便理解。不過這個主要是方便老外,他們一目了然,對於我們來說其實沒什麼用

2樓:

小孩A:我有乙個寶貝,這是我昨天在商場買的樂高!

小孩B:我也有乙個寶貝,這個是我昨天買的模型飛機。

小孩C:把你們的寶貝交出來,不然我今天不讓你們回家!

上面的「寶貝」,也就是小孩對自己的某種型別的東西的typedef,那麼別人(小孩c)只需要說出「你們的寶貝」,他們就知道各自應該指代什麼了,算是一種「靜態的多型」吧。

3樓:

無論是 using 還是 typedef 都是用來給乙個統一的介面,提供給外部使用,也提供給內部使用。這就是個快捷方式,原有型別名稱可能是太長了,不方便使用。

至於為什麼都是 typedef,就我個人閱讀原始碼的感想而言,標準庫需要實現 98 03 11 14 17 20 等多種標準。

using 本身完全可以取代 typedef,但是寫 typedef 可以保持最大的相容性。

而且很多庫 11 以前就寫了,所以就留在那裡了。新的工程推薦使用 using。

4樓:

除掉可讀性的原因以外,重要的一點原因是因為你看的是標準庫的標頭檔案,而標準規定了某些容器必須暴露哪些內部型別, 由於每個標準庫實現方式不同一,內部的資料型別並不統一,但是標準規定了所有型別的名字,因此要typedef。

這是map的標準規定[1]

[2]。

5樓:粉蒸排骨

不只是提公升可讀性,還能提公升可維護性

試想你在你的庫內部用乙個有符號整數儲存了「客戶編號」這樣乙個邏輯概念。

突然有一天需求變化,你必須要改用乙個無符號整數來儲存。如果你之前沒有乙個

typedef int customer_id_type;

這樣乙個「邏輯型別」的話,那你就需要滿世界去人肉判斷,哪些int需要改成uint,哪些又不能改。

正所謂「初創一時爽,重構火葬場」

同理,如果之前用32位型別儲存,現在要變成64位,也是同樣的問題。尤其是大型庫的實現內部,肯定需要這樣,非常需要!

另外,新時代的語法已經不是typedef了,應該用using。

using cust_id_type = int;答畢。

6樓:莊嚴

private 底下的那些,主要就是因為原型別名完整寫出來太長,於是取個短名字。

public 底下那些,除了名字長以外,通常還有很重要乙個原因:就是標準規定實現某種型別(典型的如容器,比如本例的 std::map),需要對外提供這些型別。

最典型如圖中的「iterator」和「const_iterator」,就是因為STL中的(正經)容器,需要對外提供「迭代器」型別和「常量迭代器」型別。 這樣,當有一天你需要遍歷乙個容器,比如map時,你才可以方便地這樣寫:

for(

std::

map<

std::

string

,int

>::

const_iteratorit=

m.cbegin

();it!=m

.cend

();++it)

那個 const_iterator 哪來的?就是在 map 裡定義的那個 typedef 。

為什麼C 中在析構函式中使用delete p和在普通函式中用產生不一樣的結果?

shzy delete指標後立馬賦值nullptr,並不 總 是乙個好習慣。他可能會掩蓋一些錯誤並使你的程式看似良好的繼續執行。因為delete nullptr在c 標準中有明確的定義。C 盡量總在析構裡delete,用raii管理資源。如果你偶然想嘗試delete後置空,八成是因為你無法確定指標接...

C 裡,main函式最後的return為什麼一般加0,加別的會有什麼影響?

嚴格按照標準來的話應該return EXIT SUCCESS EXIT SUCCESS這個巨集在stdlib.h中定義。另,按照21st Century C書中說法,C99以後無需在main函式體末尾顯式地return 0。 Kenneth 傳統的 nix系統中,作為乙個可執行程式的返回值,0表示正...

同樣的函式引用裡為什麼使用string引用時會清空資料?

朱涵俊 改成print a 就可以正常顯示,因為a已經分配好了,main函式返回才析構。而 abc 是在引數中的,呼叫的時候先生成乙個string 臨時變數,然後用建構函式初始化,string有個引數是const char 的建構函式。呼叫完成之後,就析構這個臨時變數了,而d引用了乙個已經析構的臨時...