序言過去,當使用typedef和define進行聲明時,我總是覺得沒有區別。
兩種使用方法是相同的。
但是,當我最近閱讀“ C陷阱和缺陷”時,我發現有很大的不同,因此有必要進行總結和記錄。
參考文獻the參考網站的一部分如下C語言宏:https://developer.aliyun.com/article/7434參考書如下“ C Primer Plus第六版”。
P478“ C陷阱和缺陷”; P100“ C ++ Primer Plus第六版” 》 P248問題的根源我在學習“ C陷阱和缺陷”時遇到了這樣的問題。
#定義T1 struct foo * typedef struct foo * T2; T1 a,b; T2 a,b; struct foo * a,b;宏定義方法,聲明擴展,T1struct foo * a,* b;類型定義方式,將語句展開。
當時我看了T2,之后,我總是很困惑,對這種指針不了解很多。
我從來不明白為什么T2推出后會是什么樣子?如果您已經了解它,那就太好了,這是個很大的不同!如果您不了解它,沒關系,我將在下面自行分析。
分析與總結consulting查閱相關參考資料后,我了解了一個基本事實;使用define宏定義只是名稱的替代;使用typedef類型定義,出來后,它是一個實型。
然后,我看到了來自“ C Primer Plus”的另一個例子。
#define BYTE unsigned char // typedef與#define函數typedef char * STRING重疊; #定義函數STRING的名稱,符號; char * name,* sign; #define STRING char *定義多個變量時,只有第一個有效。
STRING名稱,符號;字符*名稱,符號;從上面的偽代碼中可以看到,當僅用于名稱定義時,typedef具有與define相同的作用。
但是當用作其他復雜類型定義時,這兩種方法的結果卻大不相同!例如,在代碼中,您需要使用typedef定義char *的類型,并使用typedef對其進行定義,如下所示:typedef char STRING; // typedef類型聲明STRING名稱,符號;變量聲明char * name,* sign;語句擴展結果但是,如果使用define語句,結果顯然會有所不同。
示例代碼如下:#defineSTRING char * //聲明STRING,當遇到STRING時,將其替換為char * STRING名稱,符號; //變量聲明char * name,sign; //語句擴展的結果如上面的代碼所示,當遇到名稱為STRING的語句時,僅在預處理過程中使用define語句,將其完整替換為(char *),就這樣! (您可以在此處使用define來考慮其他陷阱,稍后我們將對其進行詳細總結。
)imp簡單總結一下原因。
如果沒有typedef關鍵字,則編譯器會將STRING識別為指向char的指針變量。
如果使用typedef關鍵字,則編譯器會將STRING解釋為類型的標識符,該類型是char的指針;總而言之,以這種typedef方式,編譯器將STRING解釋為類型的標識符!這個過程由編譯器處理!這種定義方法只是替換名稱。
此過程在預處理器中處理!請記住這兩個摘要,以避免更多類似的陷阱。
再次重復,定義只是替換名稱,而typedef是類型標識符! ! ! -END-來源| BabyCoder作者| FightingBoom |本文旨在傳播相關技術,版權歸原作者所有。
| |如果有任何侵權,請聯系以將其刪除| [1]為什么MCU同時具有閃存和EEPROM? [2]“歷史上最糟糕的代碼”! [3] goto語句的對與錯[4] C語言內存操作的陷阱!你踩坑了嗎? [5] RTOS如何劃分任務?