為什麼C 標頭檔案喜歡把乙個型別通過typedef定義出無數個新名字,這有什麼意義嗎?

時間 2021-09-09 10:09:06

1樓:

習慣和風格問題。

比如,在同時引用多個第三方庫,當它的命名空間相似,函式名、引數列表完全相同時,你還可以通過自定義的型別名來感知這個介面是幹什麼的。

2樓:exiledkingcc

歷史遺留問題。

比如一開始沒有uint8_t這樣的型別,就只能用typedef了。

其它的情況也類似,需要由名字直接表達其意義,就typedef定義乙個更能表明意義的名字。

另外,有了stdint之後,就不要再自己去typedef這些整數型別了,直接用標準庫裡面的(C裡面還有stdbool),不然就很混亂。

比如我最近用到乙個mcu的SDK,C語言。其中外設庫的整數型別是自己typedef的,名字是INT8,UINT8這樣。然後還提供乙個藍芽庫,標頭檔案裡面也是自己typedef這些型別,有int8,uint8這樣的,同時還有s8,u8,然後還有s8_t,u8_t。

簡直是有毛病啊是不是!用起來實在是太糟心了!

3樓:

怎麼說呢,有好處有壞處。好處的話大家都說了很多。壞處的話我覺得是增加了學習負擔,看到別名不能一下子知道這具體是個什麼型別,需要查文件記憶

4樓:kevin

設計這個語法的初衷,是為了讓型別名的語義更加明確。

但是C++的那些庫(尤其是大量使用泛型的庫),裡面的原始型別名,能一行寫下的 ,那都不好意思說自己是C++庫,所以現在的typedef 更多的是為了少打一堆字元。

5樓:也罷

極大多數時候是為了封裝為了便捷化呼叫比如說乙個複雜的結構你不用關心內部實現別人給你什麼介面什麼型別拿到手就用 (這是屬於乙個好的表現) 如搞了很多這種操作還需關心內部實現那就是茴的四種寫法純屬脫褲子放屁

6樓:Yang

需要搞清楚結構和概念的區別。結構是面向機器的,而概念是面向人的。

概念不同,結構可能相同。如:

姓名:char*

再如:體重:float

身高:float

以上的結構有:char*、float。

typedef的謎底就在謎面上,就是自定義概念。

比如:typedef char* Name;

typedef char* Address;

當然,我們可以不使用概念。只用其結構的代號(如int、char、float等)來定義變數。但,顯然「概念」的可讀性、可理解方面更勝一籌。

除了讀的方便,用的時候也方便。比如,有一天你想用std::string作為Name的結構,而不是char*。

那只改typedef那一行即可;反之,你要人肉找到需要替換的char*進行修改了。

以上,都是在預定義的結構(如int、char等)上定義概念。那能不能自定義結構呢?

class、struct就是幹這事兒的啦。同理,自定義的class就是代號,你可以直接拿來用,也可按需對其進行typedef。

7樓:

alias的主要作用難道不是為了方便修改麼……

你有功能A,需要32位整數,功能B也需要32位整數,都寫int,未來改變需求A變成需要64位的時候你就得乙個乙個改……你要是查詢int替換long long,B就跟著炸了

給A、B用的分別定義個別名,以後需求變動你就只用改一行

8樓:白如冰

typedef有的時候的作用就是告訴你,兩個樣式大小一樣的毛巾,哪個是擦臉的,哪個是擦腳的

virtual

bool

addObjects

(PrunerHandle

*results

,const

PxBounds3

*bounds

,const

PrunerPayload

*userData

,PxU32

count

,bool

hasPruningStructure

);virtual

void

removeObjects

(const

PrunerHandle

*handles

,PxU32

count

);這裡PrunerHandle實際上就是uint32,但是怎麼對應上下文一看便知

9樓:蘇心草

Any problem in computer science can be solved by another layer of indirection.

沒有什麼問題不是增加一層間接層不能解決的,如果不能,再來一層。

想想魔數,為何程式裡面把乙個 3.14,一會定義成 pi,一會定義成商品單價呢?

間接增加的是效能的降低(不一定,只是可能),但帶來的解耦,從而可以輕鬆地擁抱變化。

10樓:xkszltl

為了標記和解藕。

標記是指,如果都是int,使用者容易混用不同長度的int導致潛在bug,有個名字能減少這類問題。

解藕是指,可以避免使用者假設它一定是個特定型別,比如int,這樣可以允許庫改用其他儲存方式而不破壞現有的行為

11樓:陸海綿

基礎型別只能區分值的範圍,不能區分目標的作用。

舉個例子

char a;

這是宣告了乙個8位的整型還是宣告了乙個字元型別?不知道,只能通過變數名或對還變數的操作來分析。

typedef int_8;

int_8 a;

就沒有問題啦,a就是8位整數。

再看long long id;

long long timestamp;

兩個都是long long,但是意義不一樣typedef id_t;

typedef timestamp_t;

id_t id;

timestamp_t t;

是不是很清楚?

12樓:Weasley Frank

using funcA=int(std::vector, uint16_t);

using funcB = void(int*, funcA);

std::function FuncBCaller;

FuncBCaller(123, funcACaller(vect1, 16));

對比std::function, uint16_t)>)>(123, std::function, uint16_t)>(vect1, 16))

手機打的,差不多就是這個意思。

後面這個不是人看的。

13樓:NaN

我覺得最重要的還是質量問題。

用id做例子吧,因為實際上id並不是那個uintX_t,它是無意義二進位制串。所以id實際上應該是乙個opaque type,不過我們又必須約定sizeof,注意size_t對id來說並不是乙個很好的選擇,因為它會變,所以相對於不透明指標,我們還是typedef比較好。

雖然這會讓某些不是id的東西被允許作為id使用從而可能造成RE,不過改個型別名已經可以減少大量RE了,而C++的RE也不差這麼幾個,也就湊合用了。

14樓:

瀉藥。其實很簡單,就是為了方便記憶和統一型別。

比如說我們做遊戲,每個玩家有乙個ID,當時你可能想定為uint32_t,那麼時間久了你可能就不知道這個uint32_t是幹嘛的了,或者是幾年以後我們的玩家量上來了,想改成uint64_t,那就不知道要改多少地方。

要是在一開始就定義 typedef uint32_t userid_t; 然後在所有用到的地方都使用userid_t 就好多了。

用c語言怎麼實現把乙個檔案中所有的字串進行篩選,重複的字串只留下乙個?

NoneType deffunction file,return join set file print function open file name luoxing123 C語言的微笑由我來守護,show you my bug include include include include ty...

為什麼讓我喜歡的女孩長相都是同乙個型別?

Queen 我就是這樣,我特別喜歡的人都長著幾乎同樣類似的臉 大眼睛雙眼皮,必須微胖,必須白,有點小塌的鼻子,整齊的牙齒 非常非常像 而我只對這樣的臉心動 我也很迷茫,即使他們的性格和人品都各有不同,甚至與我也談不上適合但我就是很喜歡很喜歡那張臉 導致很迷戀很迷戀他們 我不知道這個問題怎麼處理 達拉...

C 語言開啟乙個檔案時,緩衝區在記憶體的什麼位置?

唐浩然 在使用者空間的棧的下方,堆的上方的 mmap區。對於系統來說,應用程式的mmap區的檔案可能在作業系統的 pache cache中 王飛 一般開啟並讀取乙個檔案,傳統方法就是兩個系統呼叫,對吧 int open const char path int oflag mode t mode ss...