我一貫認爲在寫代碼時,void *濫用是有問題的,在最近的一次代碼中, 有相似這樣一段代碼:spa
1 int send(void *buff, unsigned long size); 2 3 int xx_func(char *buff, unsigned long size) 4 { 5 unsigned send_size; 6 ......... 7 8 send(&buff, send_size);
9 return 0; 10 }
暫且不論爲何做者會錯寫成取地址,但其原意是想發送通過處理後的buff裏面的內容, 可是編譯器是不會報錯的,由於void *默認兼容全部類型,若是把代碼改爲下面這樣:code
int send(unsigned char *buff, unsigned long size); int xx_func(char *buff, unsigned long size) { unsigned long send_size; ......... //send(&buff, send_size); //send(buff, send_size); send((unsigned char *)buff, send_size); }
其實前兩種編譯在進行參數檢查時,都會報警的,只有寫成第三種形式,編譯器纔會真正經過,如你寫成第三種形式時不會去看buff, 究竟是什麼,那我也沒話說了。固然若是你忽略警告我也沒啥可說的了哈哈,我只想說應該儘量的去利用編譯器來發現潛在bug.orm
注:從語義上來講,send(void *buff, unsigned long size)會令人疑惑, 這個size是byte? word? dword?, 若是是unsigned char *,那size固然就是byte, 若是是unsigned short *, 那size固然就是word.(X86 platform)blog