日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

基于C语言的函数指针应用-消息命令处理框架

發(fā)布時(shí)間:2023/12/2 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于C语言的函数指针应用-消息命令处理框架 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

簡(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。