typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler);
此處由于加了typedef自定義了一個(gè)新類型sighandler_t,,所以第二行的函數(shù)原型看起來(lái)順眼多了,形式跟int func(char c, int i)無(wú)異,,但是如果看不懂typedef語(yǔ)句,,這兩句話仍然是噩夢(mèng)。 要理解typedef,,只要記住一句話就差不多了,,那就是:typedef在語(yǔ)句中所起的作用只不過(guò)是把語(yǔ)句原先定義變量的功能變成了定義類型的功能而已。我們只消看幾個(gè)例子立即明白,。 例如語(yǔ)句 typedef int *apple; 理解它的正確步驟是這樣的:先別看typedef,就剩下int *apple; 這個(gè)語(yǔ)句再簡(jiǎn)單不過(guò),,就是聲明了一個(gè)指向整型變量的指針apple (注意:定義只是一種特殊的聲明),,加上typedef之后就解釋成聲明了一種指向整型變量指針的類型apple 。 現(xiàn)在,,回過(guò)來(lái)看上面的這個(gè)函數(shù)原型 typedef void (*sighandler_t)(int),,蓋住 typedef不看 ,再簡(jiǎn)單不過(guò),,sighandler_t就是一個(gè)函數(shù)指針,,指向的函數(shù)接受一個(gè)整型參數(shù)并返回一個(gè)無(wú)類型指針 。加上typedef之后sighandler_t就是一種新的類型,,就可以像int一樣地去用它,,不同的是它聲明是一種函數(shù)指針,這種指針指向的函數(shù)接受一個(gè)整型參數(shù)并返回一個(gè)無(wú)類型指針 ,。怎么樣,?簡(jiǎn)單吧。 再來(lái)做一個(gè)更酷的練習(xí),,請(qǐng)看:typedef char *(* c[10])(int **p); 去 掉typedef就變成char *(* c[10])(int **p),,先不管這個(gè)語(yǔ)句有多難看,它一定是聲明了一個(gè)擁有10個(gè)元素的數(shù)組c對(duì)不對(duì),?okay沒什么了不起的,,只不過(guò)這個(gè)數(shù)組c的元素有點(diǎn)特別,它們都 是函數(shù)指針,,并且它們所指向的這些函數(shù)統(tǒng)統(tǒng)都接受一個(gè)二級(jí)指針然后返回一直指向字符型的指針,。加上typedef之后,,c就不是一個(gè)數(shù)組了,而是一種類型 了,,什么類型現(xiàn)在你能說(shuō)出來(lái)了吧,。 ^_^ 說(shuō)到typedef就不能不把它跟宏替換比較,typedef相對(duì)于宏替換是一種徹底的“替換”,,#define之所以被稱為宏替換,,是因?yàn)樗褪呛?jiǎn)單地照搬替換字符串。來(lái)看個(gè)例子: 例1 typedef int x[10]; 例2 #define x int[10] 例1定義了類型x,,此時(shí)我們就可以用它來(lái)定義別的變量了,,比如x y; 此時(shí)y是一個(gè)擁有10個(gè)整型變量的數(shù)組,效果與語(yǔ)句int y[10]無(wú)異,。typedef帶給我們的是一種徹底的封裝 ,。 例2用了宏定義的方式,將來(lái)在該宏的作用域范圍內(nèi)的任何地方遇到的x都將被簡(jiǎn)單地替換成int [10],。 (注意到,,宏替換結(jié)尾是不帶分號(hào)的,不同于typedef語(yǔ)句) 對(duì)于typedef和宏可以有以下總結(jié): 1,、宏定義可以擴(kuò)展,,徹底封裝的typedef不可以。
//以下代碼完全沒問(wèn)題: #define apple int; unsigned apple i; //以下代碼則完全行不通: typedef int apple; unsigned apple i;
2,、在連續(xù)聲明幾個(gè)變量的時(shí)候typedef可以完全保證變量是同一種類型,,而宏替換無(wú)法保證。
#define apple int *; apple a, b; //a和b類型完全不同,,a是指向整型變量的指針,,b是整型變量。 typedef int *apple; apple a, b; //a和b的類型完全相同,,都是指向整型變量的指針,。
永遠(yuǎn)要記住的是,typedef定義的是一種類型而不是變量,,不能指望用它來(lái)定義一個(gè)變量
typedef 定義函數(shù)類型 最近在看posix實(shí)時(shí)信號(hào)時(shí),,遇到一處函數(shù)是如此定義的:
1 |
typedef void sigfunc_rt( int ,
siginfo_t *, void *); |
在我常規(guī)理解里,一般定義一個(gè)函數(shù)類型都是這樣定義的:
1 |
typedef void (*sighandler_t)( int ); |
2 |
sighandler_t signal ( int signum,
sighandler_t handler); |
其實(shí)是這樣的,,對(duì)于函數(shù),,typedef有兩類自定義類型:
首先我們要先明白一個(gè)概念,函數(shù)名是不是指針,?也就是說(shuō)一個(gè)函數(shù)名可不可以代表一個(gè)地址,?以及什么是函數(shù)類型?
經(jīng)過(guò)查找,函數(shù)名就是一個(gè)指針,,但是意義是不一樣的,,如同于數(shù)組a[],a和&a其實(shí)都是一樣的,。當(dāng)調(diào)用一個(gè)函數(shù)時(shí),,我們都是直接用函數(shù)名調(diào)用,或者說(shuō)通過(guò)指針調(diào)用,。
函數(shù)類型,,在我理解,就是定義了一個(gè)函數(shù)應(yīng)該返回什么樣的類型,,int,?void?以及它的參數(shù)形式,。
那么:
1,,tpyedef自定義函數(shù)指針類型:
看一個(gè)例子:
03 |
typedef int (*fp_t)( char c); |
05 |
int f0( char c)
{ printf ( "f0,
c = %c\n" ,
c); return 0;} |
06 |
int f1( char c)
{ printf ( "f1,
c = %c\n" ,
c); return 1;} |
14 |
ret
= fp( 'a' );通過(guò)函數(shù)指針調(diào)用函數(shù) |
2,,typedef自定義函數(shù)類型:
例子:
03 |
typedef int f_t( char c); |
05 |
int f0( char c)
{ printf ( "f0,
c = %c\n" ,
c); return 0;} |
06 |
int f1( char c)
{ printf ( "f1,
c = %c\n" ,
c); return 1;} |
|