typedef static char int8;這個聲明正確嗎,? A:err
所以上面那個聲明是錯誤的,。
typedef為一種類型引入新的名字,而不是為變量分配空間,,它并沒有引入新的類型,,而是為現(xiàn)有的類型取個新名字。在說到typedef時,,有一個很好的例子是signal()函數(shù)聲明,,但是,一般而言只有極少數(shù)情況才會使用到這樣的技巧,,這里就不再贅述,,我們應(yīng)該知道更多關(guān)于typedef對于大多數(shù)程序員應(yīng)該知道的事,。 說到typedef就不能不說一下它的缺點。它同樣具有與其他聲明一樣的混亂語法,??梢园褞讉€聲明器塞到一個聲明中去,例如: typedef int *ptr,(*fun)(void),arr[5]; ptr是指向int的指針類型,; fun是指向返回值為int的參數(shù)為void的函數(shù)的指針類型,; arr是長度為5的int型數(shù)組類型。 上面這樣的寫法應(yīng)該盡量避免使用,。 甚至typedef的位置不是必須放在聲明的開始部分,,例如: 也不要把typedef嵌入到聲明的中間部分,如下所示: unsigned long typedef int volatile *kumquat; 這樣的表達式會讓代碼變得不好閱讀?。,。?/span> 我們使用typedef,,是為了使代碼更易于閱讀,,給已有類型取一個我們喜歡的別名,不要濫用或者亂用它,。 再來看看typedef和define的區(qū)別 最基本的區(qū)別: #define mychar char* define是純文本替換,,如果用define定義的類型定義多個對象,那樣只有第一個對象才是原本define的類型,,在上面的例子中,,b是char不是char*類型,但是c和d都是char *類型,。 還有一個區(qū)別: typedef是一種徹底的“封裝”,,在聲明它之后不能再往里面增加別的東西,這和宏不同,。 #define peach int unsigned peach i;//right typedef int banana; unsigned banana j;//err 知道這些之后,,我們平時書寫代碼就應(yīng)該遵循一些規(guī)范,把typedef放在聲明的開始,,并且一個類型用一個typedef修飾,,不要在typedef類型前后加其他聲明器。 C語言存在多種名字空間: ,。標簽:這個名字空間用于所有的結(jié)構(gòu)、枚舉,、聯(lián)合,。 。成員名:每個結(jié)構(gòu)或聯(lián)合都有自身的名字空間 ,。其他 在同一個名字空間里,,任何名字必須具有唯一性,,但在不同的名字空間里可以存在相同的名字。 由于在不同的名字空間使用同一個名字是合法的,,所以這樣的代碼是可以通過編譯的,,但還是不建議這樣書寫。 struct foo{int foo,;}foo,; typedef struct baz{int baz;} baz,; struct baz var1,; baz var2; 這些都是合法的,。只有結(jié)構(gòu)標簽?zāi)軌蛟谝院蟮穆暶髦惺褂茫ㄗ⒁饬耍,。?/span>可以用typedef定義一個結(jié)構(gòu)類型,這樣可以省略struc的書寫,,也可以直接用struct 標簽 變量的方式,就算使用了typedef也一樣,。 在使用typedef的時候,,應(yīng)該盡量避免混淆,做到思路清晰,,代碼可讀性高,。 再看一例: #include<stdio.h>
typedef char * test;
int main(void)
{
const char * str=0;
str++;// 正確底層const,常量指針,,該指針指向的對象是常量,,但指針自身可以改變
const test string=0;
string++;//錯誤,typedef出的是類型別名 char *,,此時加const修飾為指針常量,,即該指針是常量。
return 0;
}
前面說了,,不要在使用了typedef的標識符前后再加修飾(上面例子在typedef聲明的別名test前又加了一個const修飾),,那樣有可能和你想的不同。知道可能的坑,,并善于利用typedef帶給我們的便利,,typedef可以成為你的朋友。 |
|