看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《k387259 (藏鏡特務K數字)》之銘言: : 我看到一段程式碼 裡面有 : typedef struct Alist node; : typedef node *Alink; : 請問這樣打,好像是Alink就是node : 為什麼要打成這樣呢? : 一開始的struct就改成alink或者node不是就好了嗎? : 想問一下 先註一下 有些人(像我) 會忘記typedef時 struct name的先後 可以直接這樣記 把typedef拿掉該statement依舊合法的 才是正確的寫法 回到問題本身 答案很簡單 just增加可讀性而已 但是 typedef 作用在struct上 我認為對可讀性 沒有明顯改善 例如下面這兩個 LP vs. struct name本身 typedef struct myStrcut myStruct; // typedef struct myStruct *P_myStruct; 根本只有增加困擾而已 但是 如果是作用在 function pointer上 我覺得效用就很明顯了 ex: typedef handle (*open)(const char* filename, const char* mode); typedef int (*close)(handle); typedef int (*read)(handle, char* buf, size_t buf_size); typedef int (*write)(handle, char* buf, size_t buf_size); 然後把這些function打包起來 就成了 簡單的 file/socket/process 的通用interface了 另外一個例子是 Android的debug log寫法 typedef int (*android_log_write_buf)(int bufID, const char* msg, int size); // 我有點忘記 反正大概長這樣... 他會寫成 兩組相對應的implememt ex: static android_log_write_buf __adroid_write_log = __android_log_write_buf_init; int __android_log_write_buf_init(int bufID, const char* msg, int size){ // try to ope n log file handler... if(/*如果都成功*/) __adroid_write_log = __android_log_write_buf_impl; else __adroid_write_log = __android_log_write_buf_null; __adroid_write_log( bufID, msg, size ; } int __android_log_write_buf_impl(int bufID, const char* msg, int size){ // 真的implement 實作在這邊 } int __android_log_write_buf_null(int bufID, const char* msg, int size){ return 0; // 沒錯 直接放空 } 這個用typedef 明顯增加可讀性 如果不用typedef 直接展開看 眼睛都花了... 題外話: 這樣可以做到類似 state pattern的效果 不過因為只有 兩個state, 另一種名稱 null pointer pattern可能比較適合 -- -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.166.120.113
loveme00835:推一個 :) 系列文再起 XD 10/05 00:21