C语言typedef关键字—伟大的缝纫师
生活随笔
收集整理的這篇文章主要介紹了
C语言typedef关键字—伟大的缝纫师
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
關(guān)于馬甲的笑話。有這樣一個(gè)笑話:一個(gè)獵人在河邊抓捕一條蛇,蛇逃進(jìn)了水里。過(guò)一會(huì),一個(gè)烏龜爬到岸邊。獵人一把抓住這個(gè)烏龜,大聲的說(shuō)道:小樣,別你為你穿了個(gè)馬甲我就不認(rèn)識(shí)你了!
typedef 關(guān)鍵字是個(gè)偉大的縫紉師,擅長(zhǎng)做馬甲,任何東西穿上這個(gè)馬甲就立馬變樣。它可以把狼變成一頭羊,也能把羊變成一頭狼。甚至還可以把長(zhǎng)著翅膀的鳥人變成天使,同樣也能把美麗的天使變成鳥人。所以,你千萬(wàn)不要得罪它,一定要掌握它的脾氣,不然哪天我把你當(dāng)鳥人,你可別怪我。^_^。
在實(shí)際項(xiàng)目中,為了方便,可能很多數(shù)據(jù)類型(尤其是結(jié)構(gòu)體之類的自定義數(shù)據(jù)類型)需要我們重新取一個(gè)適用實(shí)際情況的別名。這時(shí)候typedef 就可以幫助我們。例如:
typedef struct student
{
? ?//code
}Stu_st,*Stu_pst;//命名規(guī)則請(qǐng)參考本章前面部分
A),struct student stu1;和Stu_st stu1;沒(méi)有區(qū)別。
B),struct student *stu2;和Stu_pst stu2;和Stu_st *stu2;沒(méi)有區(qū)別。
這個(gè)地方很多初學(xué)者迷惑,B)的兩個(gè)定義為什么相等呢?其實(shí)很好理解。我們把“struct student { /*code*/}”看成一個(gè)整體,typedef 就是給“struct student {/*code*/}”取了個(gè)別名叫“Stu_st”;同時(shí)給“struct student { /*code*/} *”取了個(gè)別名叫“Stu_pst”。只不過(guò)這兩個(gè)名字同時(shí)取而已,好比你給你家小狗取了個(gè)別名叫“大黃”,同時(shí)你妹妹給小狗帶了小帽子,然后給它取了個(gè)別名叫“小可愛(ài)”。^_^。
好,下面再把typedef 與const 放在一起看看:
C),const Stu_pst stu3;
D),Stu_pst const stu4;
大多數(shù)初學(xué)者認(rèn)為C)里const 修飾的是stu3 指向的對(duì)象;D)里const 修飾的是stu4這個(gè)指針。很遺憾,C)里const 修飾的并不是stu3 指向的對(duì)象。那const 這時(shí)候到底修飾的是什么呢?我們?cè)谥v解const int i 的時(shí)候說(shuō)過(guò)const 放在類型名“int”前后都行;而const int?*p 與int * const p 則完全不一樣。 也就是說(shuō),我們看const 修飾誰(shuí)都時(shí)候完全可以將數(shù)據(jù)類型名視而不見(jiàn),當(dāng)它不存在。反過(guò)來(lái)再看“const Stu_pst stu3”,Stu_pst 是“struct student?{ /*code*/} *”的別名, “struct student {/*code*/} *”是一個(gè)整體。 對(duì)于編譯器來(lái)說(shuō),只認(rèn)為Stu_pst 是一個(gè)類型名,所以在解析的時(shí)候很自然的把“Stu_pst”這個(gè)數(shù)據(jù)類型名忽略掉。
現(xiàn)在知道const 到底修飾的是什么了吧?^_^。
E) #define INT32 int
? ? ? ?unsigned INT32 i = 10;
F)typedef int int32;
? ? ? unsigned int32 j = 10;
其中F)編譯出錯(cuò),為什么呢?E)不會(huì)出錯(cuò),這很好理解, 因?yàn)樵陬A(yù)編譯的時(shí)候INT32被替換為int,而unsigned int i = 10;語(yǔ)句是正確的。但是,很可惜,用typedef 取的別名不支持這種類型擴(kuò)展。另外,想想typedef static int int32 行不行?為什么?
下面再看一個(gè)與#define 宏有關(guān)的例子:
G) ?#define PCHAR char*
? ? ? PCHAR p3,p4;
H)typedef char* pchar;
? ? ? ?pchar p1,p2;
兩組代碼編譯都沒(méi)有問(wèn)題, 但是,這里的p4 卻不是指針,僅僅是一個(gè)char 類型的字符。這種錯(cuò)誤很容易被忽略,所以用#define 的時(shí)候要慎之又慎。關(guān)于#define 當(dāng)然還有很多話題需要討論,請(qǐng)看預(yù)處理那一章。當(dāng)然關(guān)于typedef 的討論也還沒(méi)有結(jié)束,在指針與數(shù)組那一章,我們還要繼續(xù)討論。
1)#define a int[10]
A),a[10] a[10];
B),a[10] a;
C),int a[10];
D),int a;
E),a b[10];
F),a b;
G),a* b[10];
H),a* b;
2) typedef int a[10];
A),a[10] a[10];
B),a[10] a;
C),int a[10];
D),int a;
E),a b[10];
F),a b;
G),a* b[10];
H),a* b;
3) #define a int*[10]
A),a[10] a[10];
B),a[10] a;
C),int a[10];
D),int a;
E),a b[10];
F),a b;
G),a* b[10];
H),a* b;
4) ? typedef int * a[10];
A),a[10] a[10];
B),a[10] a;
C),int a[10];
D),int a;
E),a b[10];
F),a b;
G),a* b[10];
H),a* b;
5) #define *a int[10]
A),a[10] a[10];
B),a[10] a;
C),int a[10];
D),int a;
E),a b[10];
F),a b;
G),a* b[10];
H),a* b;
6) ? typedef int (* a)[10];
A),a[10] a[10];
B),a[10] a;
C),int a[10];
D),int a;
E),a b[10];
F),a b;
G),a* b[10];
H),a* b;
7) #define *a * int[10]
A),a[10] a[10];
B),a[10] a;
C),int a[10];
D),int a;
E),a b[10];
F),a b;
G),a* b[10];
H),a* b;
8) ?typedef int * (* a)[10];
A),a[10] a[10];
B),a[10] a;
C),int a[10];
D),int a;
E),a b[10];
F),a b;
G),a* b[10];
H),a* b;
請(qǐng)判斷這里面哪些定義正確,哪些定義不正確。另外,int[10]和a[10]到底該怎么用?
typedef 關(guān)鍵字是個(gè)偉大的縫紉師,擅長(zhǎng)做馬甲,任何東西穿上這個(gè)馬甲就立馬變樣。它可以把狼變成一頭羊,也能把羊變成一頭狼。甚至還可以把長(zhǎng)著翅膀的鳥人變成天使,同樣也能把美麗的天使變成鳥人。所以,你千萬(wàn)不要得罪它,一定要掌握它的脾氣,不然哪天我把你當(dāng)鳥人,你可別怪我。^_^。
一、歷史的誤會(huì)——也許應(yīng)該是typerename。
很多人認(rèn)為typedef 是定義新的數(shù)據(jù)類型,這可能與這個(gè)關(guān)鍵字有關(guān)。本來(lái)嘛,type 是數(shù)據(jù)類型的意思;def(ine)是定義的意思,合起來(lái)就是定義數(shù)據(jù)類型啦。不過(guò)很遺憾,這種理解是不正確的。也許這個(gè)關(guān)鍵字該被替換為“typerename”或是別的詞。 typedef 的真正意思是給一個(gè)已經(jīng)存在的數(shù)據(jù)類型(注意:是類型不是變量)取一個(gè)別名,而非定義一個(gè)新的數(shù)據(jù)類型。比如:華美絕倫的芍藥,就有個(gè)別名---“將離”。中國(guó)古代男女交往,往往以芍藥相贈(zèng),表達(dá)惜別之情,送芍藥就意味著即將分離。所以文人墨客就給芍藥取了個(gè)意味深長(zhǎng)的別名-----“將離”。這個(gè)新的名字就表達(dá)了那種依依不舍的惜別之情…這樣新的名字與原來(lái)的名字相比,就更能表達(dá)出想要表達(dá)的意思。在實(shí)際項(xiàng)目中,為了方便,可能很多數(shù)據(jù)類型(尤其是結(jié)構(gòu)體之類的自定義數(shù)據(jù)類型)需要我們重新取一個(gè)適用實(shí)際情況的別名。這時(shí)候typedef 就可以幫助我們。例如:
typedef struct student
{
? ?//code
}Stu_st,*Stu_pst;//命名規(guī)則請(qǐng)參考本章前面部分
A),struct student stu1;和Stu_st stu1;沒(méi)有區(qū)別。
B),struct student *stu2;和Stu_pst stu2;和Stu_st *stu2;沒(méi)有區(qū)別。
這個(gè)地方很多初學(xué)者迷惑,B)的兩個(gè)定義為什么相等呢?其實(shí)很好理解。我們把“struct student { /*code*/}”看成一個(gè)整體,typedef 就是給“struct student {/*code*/}”取了個(gè)別名叫“Stu_st”;同時(shí)給“struct student { /*code*/} *”取了個(gè)別名叫“Stu_pst”。只不過(guò)這兩個(gè)名字同時(shí)取而已,好比你給你家小狗取了個(gè)別名叫“大黃”,同時(shí)你妹妹給小狗帶了小帽子,然后給它取了個(gè)別名叫“小可愛(ài)”。^_^。
好,下面再把typedef 與const 放在一起看看:
C),const Stu_pst stu3;
D),Stu_pst const stu4;
大多數(shù)初學(xué)者認(rèn)為C)里const 修飾的是stu3 指向的對(duì)象;D)里const 修飾的是stu4這個(gè)指針。很遺憾,C)里const 修飾的并不是stu3 指向的對(duì)象。那const 這時(shí)候到底修飾的是什么呢?我們?cè)谥v解const int i 的時(shí)候說(shuō)過(guò)const 放在類型名“int”前后都行;而const int?*p 與int * const p 則完全不一樣。 也就是說(shuō),我們看const 修飾誰(shuí)都時(shí)候完全可以將數(shù)據(jù)類型名視而不見(jiàn),當(dāng)它不存在。反過(guò)來(lái)再看“const Stu_pst stu3”,Stu_pst 是“struct student?{ /*code*/} *”的別名, “struct student {/*code*/} *”是一個(gè)整體。 對(duì)于編譯器來(lái)說(shuō),只認(rèn)為Stu_pst 是一個(gè)類型名,所以在解析的時(shí)候很自然的把“Stu_pst”這個(gè)數(shù)據(jù)類型名忽略掉。
現(xiàn)在知道const 到底修飾的是什么了吧?^_^。
二、typedef 與#define 的區(qū)別
噢,上帝!這真要命!別急,要命的還在后面呢。看如下例子:E) #define INT32 int
? ? ? ?unsigned INT32 i = 10;
F)typedef int int32;
? ? ? unsigned int32 j = 10;
其中F)編譯出錯(cuò),為什么呢?E)不會(huì)出錯(cuò),這很好理解, 因?yàn)樵陬A(yù)編譯的時(shí)候INT32被替換為int,而unsigned int i = 10;語(yǔ)句是正確的。但是,很可惜,用typedef 取的別名不支持這種類型擴(kuò)展。另外,想想typedef static int int32 行不行?為什么?
下面再看一個(gè)與#define 宏有關(guān)的例子:
G) ?#define PCHAR char*
? ? ? PCHAR p3,p4;
H)typedef char* pchar;
? ? ? ?pchar p1,p2;
兩組代碼編譯都沒(méi)有問(wèn)題, 但是,這里的p4 卻不是指針,僅僅是一個(gè)char 類型的字符。這種錯(cuò)誤很容易被忽略,所以用#define 的時(shí)候要慎之又慎。關(guān)于#define 當(dāng)然還有很多話題需要討論,請(qǐng)看預(yù)處理那一章。當(dāng)然關(guān)于typedef 的討論也還沒(méi)有結(jié)束,在指針與數(shù)組那一章,我們還要繼續(xù)討論。
三、#define a int[10]與typedef int a[10];
留兩個(gè)問(wèn)題:1)#define a int[10]
A),a[10] a[10];
B),a[10] a;
C),int a[10];
D),int a;
E),a b[10];
F),a b;
G),a* b[10];
H),a* b;
2) typedef int a[10];
A),a[10] a[10];
B),a[10] a;
C),int a[10];
D),int a;
E),a b[10];
F),a b;
G),a* b[10];
H),a* b;
3) #define a int*[10]
A),a[10] a[10];
B),a[10] a;
C),int a[10];
D),int a;
E),a b[10];
F),a b;
G),a* b[10];
H),a* b;
4) ? typedef int * a[10];
A),a[10] a[10];
B),a[10] a;
C),int a[10];
D),int a;
E),a b[10];
F),a b;
G),a* b[10];
H),a* b;
5) #define *a int[10]
A),a[10] a[10];
B),a[10] a;
C),int a[10];
D),int a;
E),a b[10];
F),a b;
G),a* b[10];
H),a* b;
6) ? typedef int (* a)[10];
A),a[10] a[10];
B),a[10] a;
C),int a[10];
D),int a;
E),a b[10];
F),a b;
G),a* b[10];
H),a* b;
7) #define *a * int[10]
A),a[10] a[10];
B),a[10] a;
C),int a[10];
D),int a;
E),a b[10];
F),a b;
G),a* b[10];
H),a* b;
8) ?typedef int * (* a)[10];
A),a[10] a[10];
B),a[10] a;
C),int a[10];
D),int a;
E),a b[10];
F),a b;
G),a* b[10];
H),a* b;
請(qǐng)判斷這里面哪些定義正確,哪些定義不正確。另外,int[10]和a[10]到底該怎么用?
總結(jié)
以上是生活随笔為你收集整理的C语言typedef关键字—伟大的缝纫师的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 一创智富通是哪个证券
- 下一篇: 保险金额和保额的区别 保险金额与保额区别