基于C语言的函数指针应用-消息命令处理框架
生活随笔
收集整理的這篇文章主要介紹了
基于C语言的函数指针应用-消息命令处理框架
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
簡述
大家都知道,在C語音中指針的地位很重要,各種指針,功能很強大!但是用不好,指針也比較容易出問題。
這里介紹的是函數指針的一種應用方法,即使用函數指針來實現消息命令的注冊與回調處理。
代碼
測試的處理函數,這里為了測試,都是空函數:
#include? #include?"test_msg_proc.h"void?proc_msg_reg(int?cmd,?const?void?*pData,?int?len) {printf("in?proc_msg_reg??,?cmd:?%d,?data:?%s,?data?len:?%d\n",?cmd,?(const?char?*)pData,?len);//處理數據 }void?proc_msg_login(int?cmd,?const?void?*pData,?int?len) {printf("in?proc_msg_login,?cmd:?%d,?data:?%s,?data?len:?%d\n",?cmd,?(const?char?*)pData,?len);//處理數據 }void?proc_msg_test(int?cmd,?const?void?*pData,?int?len) {printf("in?proc_msg_test?,?cmd:?%d,?data:?%s,?data?len:?%d\n",?cmd,?(const?char?*)pData,?len);//處理數據 }函數指針定義:
//函數指針 typedef?void?(*pfunc)(int?,?const?void?*,?int?);消息處理節點信息結構體:
//消息處理節點信息結構體 typedef?struct?MsgProcNodeInfo {int?cmd;??????????//消息名字char?name[64];????//用于存儲消息名字,方便調試pfunc?func;???//處理回調函數 }MsgProcNodeInfoSt;接下來是一個消息信息結構體的數組定義,也就是關鍵部分,消息命令的注冊表:
//消息處理注冊表,注冊命令字與其對應的處理函數 static??MsgProcNodeInfoSt?msgMap[]= {{0,?"regCmd",???proc_msg_reg},{1,?"loginCmd",?proc_msg_login},{2,?"testCmd",??proc_msg_test}, };主處理函數,用于根據命令字在注冊表里查找對應的處理函數,然后回調處理。這里面有個小技巧,如果命令字與數組索引正好是一致的,那可以直接拿命令字作為數組的下表去索引對應的節點調用其函數指針即可。
//處理函數 void?proc_msg(int?cmd,?const?void?*pData,?int?len) { #if?1//處理int?i?=?0;?for?(?i?=?0;?i?<?sizeof(msgMap)/sizeof(MsgProcNodeInfoSt);?i ?){if?(?msgMap[i].cmd?!=?cmd?)continue;if?(?msgMap[i].func?==?NULL?)continue;msgMap[i].func(cmd,?pData,?len);}#else?????//如果命令字正好與數組索引相同,也可以這樣取巧,直接拿命令字作為索引用if?(?cmd?>=?sizeof(msgMap)/sizeof(MsgProcNodeInfoSt)?)?//越界判斷return;msgMap[cmd].func(cmd,?pData,?len); #endif???? }主函數:
#include? #include?"test_msg_proc.h"int?main(int?argc,?char?**argv) {proc_msg(0,?"注冊",?sizeof("注冊"));proc_msg(1,?"登錄",?sizeof("登錄"));proc_msg(2,?"測試",?sizeof("測試"));return?0; }編譯運行結果
編譯:
[fens@fens?app/test_func_point]$make? gcc?-Wall??-I.?-c?main.c?-o?main.o? gcc?-Wall??-I.?-c?test_msg_proc.c?-o?test_msg_proc.o? gcc?./main.o?./test_msg_proc.o?-o?test?-Wall??-I.?-lpthread strip?test運行:
[fens@fens?app/test_func_point]$./test in?proc_msg_reg??,?cmd:?0,?data:?注冊,?data?len:?7 in?proc_msg_login,?cmd:?1,?data:?登錄,?data?len:?7 in?proc_msg_test?,?cmd:?2,?data:?測試,?data?len:?7從上面的打印可以看出,命令字處理的時候都對應到了注冊的回調函數。
在實際用時,數據的內容可以是十六進制數據,命令字也可以改為字符串格式。
聲明:
本文于網絡整理,版權歸原作者所有,如來源信息有誤或侵犯權益,請聯系我們刪除或授權事宜。
總結
以上是生活随笔為你收集整理的基于C语言的函数指针应用-消息命令处理框架的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手机空号了还能补回来吗
- 下一篇: 起雾的原因 为什么会起雾