Re: [問題] 關於typedef
看板C_and_CPP作者softwind (software everywhere)時間15年前 (2010/10/04 14:46)推噓1(1推 0噓 0→)留言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
10/05 00:21, 1F
討論串 (同標題文章)