#define #define是預(yù)處理指令,,在編譯時(shí)不進(jìn)行任何檢查,只進(jìn)行簡單的替換 宏定義的一般形式為: #define 宏名 字符串 這里所說的字符串是一般意義上的字符序列,,不要和C語言中的字符串等同,,它不需要雙引號(hào)。 typedef typedef是在C語言中用來為復(fù)雜的聲明定義簡單的別名,,它本身是一種存儲(chǔ)類的關(guān)鍵字,,與auto、extern,、mutable,、static、register等關(guān)鍵字不能出現(xiàn)在同一個(gè)表達(dá)式中,。 typedef取別名的一般形式為: typedef 舊名字 新名字 #define與typedef的區(qū)別 (1)#define之后不帶分號(hào),,typedef之后帶分號(hào)。 (2)#define可以使用其他類型說明符對(duì)宏類型名進(jìn)行擴(kuò)展,,而 typedef 不能這樣做,。如: #define INT1 int unsigned INT1 n; //沒問題 typedef int INT2; unsigned INT2 n; //有問題 INT1可以使用類型說明符unsigned進(jìn)行擴(kuò)展,而INT2不能使用unsigned進(jìn)行擴(kuò)展,。 (3)在連續(xù)定義幾個(gè)變量的時(shí)候,,typedef 能夠保證定義的所有變量均為同一類型,而 #define 則無法保證。如: #define PINT1 int*; P_INT1 p1,p2; //即int *p1,p2; typedet int* PINT2; P_INT2 p1,p2; //p1,、p2 類型相同 PINT1定義的p1與p2類型不同,,即p1為指向整形的指針變量,p2為整形變量,;PINT2定義的p1與p2類型相同,,即都是指向 int 類型的指針。 下面看一個(gè)關(guān)于typedef的重要的問題??!請(qǐng)看代碼: #include <stdio.h> 這段代碼編譯會(huì)報(bào)一個(gè)錯(cuò)誤(error: increment of read-only variable 'p2'),你知道問題出在哪嗎,? 答案與解析: 是第五行代碼p2++出錯(cuò)了,。這個(gè)問題提醒我們:typedef和#define不同,它不是簡單的文本替換,。上述代碼中const pStr p2并不等于const char * p2,。const pStr p2和pStr const p2本質(zhì)上沒有區(qū)別,都是對(duì)變量進(jìn)行只讀限制,,只不過此處變量p2的數(shù)據(jù)類型是我們自己定義的而不是系統(tǒng)固有類型而已,。因此,const pStr p2的含義是:限定數(shù)據(jù)類型為char *的變量p2為只讀,,即為char* const p2,,表明p2是一個(gè)指向char類型的常指針,所以p2是不可修改的,,因此p2++錯(cuò)誤,。 順便提一下關(guān)于const聲明的一些例子及其含義: const int a; //① int const b; //② const int *c; //③ int * const d; //④ int const * e const; //⑤ ①a是常數(shù),不可改變,; ②b是常數(shù),,不可改變 ③c是一個(gè)指向整型常數(shù)的指針,指針可以變,,指針指向的內(nèi)容不可以變,; ④d是一個(gè)指向整型變量的常指針,指針不可以變,,指針指向的內(nèi)容可以變,; ⑤e是一個(gè)指向整型常數(shù)的常指針,,指針與指針指向的內(nèi)容都不可變,。 歷史文章精選: 02 小學(xué)生都在使用手機(jī)學(xué)習(xí)編程了,你還在吃雞打王者,? 03 別用Visua C++6.0來開發(fā)C程序了,,用…… 09 getchar()、getche(),、getch()的區(qū)別,? 我是肥胖的正念君 覺得正念君很胖的話 就來給我點(diǎn)個(gè)贊吧 ↓ ↓ ↓ ↓ ↓ ↓ |
|