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