typedef static char int8;這個宣告正確嗎?
所以上面那個宣告是錯誤的。
typedef為一種型別引入新的名字,而不是為變數分配空間,它並沒有引入新的型別,而是為現有的型別取個新名字。在說到typedef時,有乙個很好的例子是signal()函式宣告,但是,一般而言只有極少數情況才會使用到這樣的技巧,這裡就不再贅述,我們應該知道更多關於typedef對於大多數程式設計師應該知道的事。
說到typedef就不能不說一下它的缺點。它同樣具有與其他宣告一樣的混亂語法。可以把幾個宣告器塞到乙個宣告中去,例如:
typedef int *ptr,(*fun)(void),arr[5];ptr是指向int的指標型別;
fun是指向返回值為int的引數為void的函式的指標型別;
arr是長度為5的int型陣列型別。
上面這樣的寫法應該盡量避免使用。
甚至typedef的位置不是必須放在宣告的開始部分,例如:
也不要把typedef嵌入到宣告的中間部分,如下所示:
unsigned long typedef int這樣的表示式會讓**變得不好閱讀!!!volatile *kumquat;
我們使用typedef,是為了使**更易於閱讀,給已有型別取乙個我們喜歡的別名,不要濫用或者亂用它。
再來看看typedef和define的區別
最基本的區別:
#define mychar char*
mychar a,b;
typedef char * yourchar;
yourchar c,d;
define是純文字替換,如果用define定義的型別定義多個物件,那樣只有第乙個物件才是原本define的型別,在上面的例子中,b是char不是char*型別,但是c和d都是char *型別。
還有乙個區別:
typedef是一種徹底的「封裝」,在宣告它之後不能再往裡面增加別的東西,這和巨集不同。
知道這些之後,我們平時書寫**就應該遵循一些規範,把typedef放在宣告的開始,並且乙個型別用乙個typedef修飾,不要在typedef型別前後加其他宣告器。
c語言存在多種名字空間:
。標籤名
。標籤:這個名字空間用於所有的結構、列舉、聯合。
。成員名:每個結構或聯合都有自身的名字空間
。其他在同乙個名字空間裡,任何名字必須具有唯一性,但在不同的名字空間裡可以存在相同的名字。
由於在不同的名字空間使用同乙個名字是合法的,所以這樣的**是可以通過編譯的,但還是不建議這樣書寫。
struct foofoo;
typedef struct baz baz;
struct baz var1;
baz var2;
這些都是合法的。只有結構標籤能夠在以後的宣告中使用(注意了!)。可以用typedef定義乙個結構型別,這樣可以省略struc的書寫,也可以直接用struct 標籤 變數的方式,就算使用了typedef也一樣。
在使用typedef的時候,應該盡量避免混淆,做到思路清晰,**可讀性高。
再看一例:
#includetypedef前面說了,不要在使用了typedef的識別符號前後再加修飾(上面例子在typedef宣告的別名test前又加了乙個const修飾),那樣有可能和你想的不同。知道可能的坑,並善於利用typedef帶給我們的便利,typedef可以成為你的朋友。char *test;
int main(void
)
誰是你的潛在朋友
總時間限制 1000ms 記憶體限制 65536kb 描述 臭味相投 這是我們描述朋友時喜歡用的詞彙。兩個人是朋友通常意味著他們存在著許多共同的興趣。然而作為乙個宅男,你發現自己與他人相互了解的機會並不太多。幸運的是,你意外得到了乙份北大圖書館的圖書借閱記錄,於是你挑燈熬夜地程式設計,想從中發現潛在...
朋友決定你的財富
幾年前,我參加了乙個主題為 創造財富 的論壇。在討論會上,乙個發言人在演說過程中向聽眾提出了乙個問題。他說 請大家拿出一頁紙,然後在紙上寫下和你相處時間最多的6個人,也可以說是與你關係最親密的6個朋友,記下他們每個人的月收入。然後,算出這6個人月收入的總和,最後算出他們月收入的平均數。這個平均值便能...
PKU 誰是你潛在的朋友
臭味相投 這是我們描述朋友時喜歡用的詞彙。兩個人是朋友通常意味著他們存在著許多共同的興趣。然而作為乙個宅男,你發現自己與他人相互了解的機會並不太多。幸運的是,你意外得到了乙份北大圖書館的圖書借閱記錄,於是你挑燈熬夜地程式設計,想從中發現潛在的朋友。首先你對借閱記錄進行了一番整理,把n個讀者依次編號為...