前言
在C語言中typedef用來給復(fù)雜聲明定義別名非常的方便,不過有時(shí)候typedef在復(fù)雜聲明中不好理解。本文關(guān)鍵的一句話幫你理解ytpedef的用法。
typedef常見應(yīng)用場(chǎng)景
在這之前,我們來看看一些常見應(yīng)用場(chǎng)景。
為特定含義的類型取別名
例如,假設(shè)速度是整型值:
typedefintSpeedType;
那么你就可以像下面這樣使用了:
#include
typedefintSpeedType;
intmain(void)
{
SpeedTypes=10;
printf("speedis%dm/s",s);
return0;
}
在main函數(shù)中,你可以直接使用SpeedType作為一種類型來定義變量了。有人可能問了,為什么要這樣,直接使用int不是更好嗎?那么如果你的代碼中很多地方都用到了這個(gè),但是突然有一天不再使用int,而是使用long呢?是不是直接修改typedef部分就可以了?(當(dāng)然打印的地方也需要變,可自定義打印函數(shù)),另外一方面,通過SpeedType這個(gè)名字就可以非常直接的讀懂變量的含義。
事實(shí)上,size_t,socklen_t等類型都是類似的定義。
說到typedef,就需要提一下define了,define只是一個(gè)字符串簡(jiǎn)單替換。當(dāng)然下面這樣的例子你可能見過很多次了:
#definePIONTERint*
PIONTERa,b;//等同于int*a,b;
typedefint*POINTER1
POINTER1c,d;//等同于int*c;int*d;
為結(jié)構(gòu)體取別名
這個(gè)也比較常見,不過有的人認(rèn)為,為結(jié)構(gòu)體取別名并不是一個(gè)明智的選擇,因?yàn)樗谑褂玫臅r(shí)候不能直觀看到它是結(jié)構(gòu)體類型了。
structinfo
{
charname[128];
intlength;
};
那么你在聲明變量的時(shí)候,需要帶上struct,即像下面這樣使用:
structinfovar;
但是如果你用typedef取個(gè)別名呢?
typedefstructinfo
{
charname[128];
intlength;
}Info;
你就可以像下面這樣使用了:
Infovar;
聲明函數(shù)指針類型
前面的都很好理解,那么來看看函數(shù)指針:
typedefvoid*(*Fun)(int,int);
這里將返回類型為void *,入?yún)閕nt的函數(shù)類型命名為Fun,那么在其他地方,就可以像下面這樣使用啦:
//來源:公眾號(hào)【編程珠璣】,博客地址:https://www.yanbinghu.com
#include
typedefvoid*(*Fun)(int,int);
void*test(inta,intb)
{
printf("%d,%d
",a,b);
//dosomething
returnNULL;
}
intmain(void)
{
Funmyfun=test;//這里的Fun已經(jīng)是一種類型名了
myfun(1,1);
return0;
}
是不是發(fā)現(xiàn)跟前面的不一樣了呢?類型別名的位置飄忽不定,有的在最后,有的在中間。
當(dāng)然typedef的場(chǎng)景并不限于以上幾種,這里僅僅是舉例。
一句話理解
我不知道你是不是已經(jīng)完全理解了前面的場(chǎng)景,無論理解與否,這句話都能很好的幫助你再次理解前面的內(nèi)容:
typedef中聲明的類型在變量名的位置出現(xiàn)。
什么意思呢,我們回頭來看。我們是怎么聲明int類型變量的?
intTypename;
像上面這樣,對(duì)不對(duì)?那么用typedef之后呢?把變量名的位置替換為別名:
typedefintTypename;
好了,你現(xiàn)在已經(jīng)把為int取別名為Typename。
再來看結(jié)構(gòu)體,聲明普通結(jié)構(gòu)體變量:
structinfo
{
charname[128];
intlength;
};
structinfoTypename;
用typedef取別名,別名取代變量名的位置:
structinfo
{
charname[128];
intlength;
};
typedefstructinfoTypename;
好了,你現(xiàn)在已經(jīng)為struct info取別名為Typename。
當(dāng)然這可能我們平常通常使用下面這種寫法:
typedefstructinfo
{
charname[128];
intlength;
}Typename;
再來看函數(shù)指針類型,我們平常是如何聲明函數(shù)的?
void*function(int,int);
那么使用typedef取別名呢?用別名取代函數(shù)名的位置即可:
void*(*Fun)(int,int);
不過這里需要注意用括號(hào)將這個(gè)別名括起來,并在前面加*號(hào)。
總結(jié)
至此,相信你對(duì)typedef的使用有了更清晰的認(rèn)識(shí)了。
-
typedef
+關(guān)注
關(guān)注
0文章
26瀏覽量
9527 -
main
+關(guān)注
關(guān)注
0文章
38瀏覽量
6128
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論