Re: [問題] 關於typedef

看板C_and_CPP作者 (software everywhere)時間15年前 (2010/10/04 14:46), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串6/6 (看更多)
※ 引述《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

10/05 00:21, , 1F
推一個 :) 系列文再起 XD
10/05 00:21, 1F
文章代碼(AID): #1CgUZRZ4 (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
問題
5
15
完整討論串 (本文為第 6 之 6 篇):
問題
1
1
問題
1
9
問題
7
34
問題
5
9
問題
5
15
文章代碼(AID): #1CgUZRZ4 (C_and_CPP)