C语言工作笔记-对函数指针的进一步认识(与回调函数结合使用,并且对比C++的回调)
目錄
?
背景和基本概念(含與C++回調對比)
函數指針最一般的用法
函數指針結合回調
源碼打包
?
背景和基本概念(含與C++回調對比)
畢業也有10個月了,加上實習已經工作14個月了,感覺這一年多的板磚生涯學到了很多的東西。同樣本人對函數指針又有了新的認識。原因是這個月在某平臺上進行二次開發,發現這里面有很多的callback!這個callback并不是C++里的callback,而是C語言的Callback。
估計是開發這個平臺的人喜歡C語言的Callback,而不喜歡C++的Callback。
這里我簡單說明下我對這兩種Callback體會:
在我這邊的項目中,我接觸過2種不同的回調!
一種是C語言的,他的回調方式是使用函數指針。通常會有一個注冊函數,把要回調的函數注冊進去,之后就通過函數指針進行調用,這種是我最近才接觸到的。
還有一種回調是C++的回調。這個在項目里面接觸得比較多,畢竟現在我就是C++開發工程師(雖然有時候也做Java和DBA的工作),這種回調感覺比C語言的回調更加的靈活。這種一般是類繼承的概念,一般用純虛類使用純虛函數充當接口(也有用一般的類,用虛函數做接口的),用虛函數的特點使用父類指針調用子類對象。感覺C++的回調,還是比C語言靈活的。
下面將說明下C語言中函數指針結合回調函數的用法;
?
函數指針最一般的用法
下面給出函數指針最一般的用法,估計稍微學過C語言語法的學生都會使用:
#include <stdio.h>int Sum(int a, int b){return a + b; }int main(int argc, int **argv){int (*pFun)(int a, int b);pFun = Sum;printf("Sum=%d\n", pFun(100, 200));getchar();return 0; }運行截圖如下:
但這樣的函數指針并不能提現他真正方便的地方!
下面說下他正在方便的地方!
?
函數指針結合回調
這里其實可以把函數指針理解為變量,如下代碼:
int (*fun1)(char); int *(*fun2)(char); int (*fun3[])(char); int *(*fun4[])(char);typedef int(*pProcFun)(char); pProcFun pFun1; pProcFun pFun3[]; pProcFun *pFun3ptr; pProcFun pFun2; pProcFun pFun4[]; pProcFun *pFun4ptr;如下最基礎的,模塊注冊,模塊管理,根據函數指針回調的例子!
運行截圖如下:
程序結構如下:
源碼如下:
FirstModule.h
#pragma once #include "stdef.h" #include "moduleAdmin.h"int InitFirstModule();moduleAdmin.h
#pragma once#include "stdef.h"typedef enum tagMODULE_SETS //SETS表示這是枚舉集合 {MY_ALL_MODULE = 0,MY_READ_MODULE = 1,MY_WRITE_MODULE = 2,MY_INVALID_MODULE = 0xffff}MODULE_SETS_E; //E表示enumtypedef int(*pProcFun)();typedef struct tagMoudleData //一般帶有管理的結構體在C語言中都是tagXXXX {int iModule; //每個模塊唯一IDpProcFun pFun; }MOUDLE_DATA_S; //一般在結構體結尾都加S,代表struct;int RegisterProc(int iModule, pProcFun pFun); int ExcuteAllModule();SecondMoudle.h
#pragma once#include "stdef.h" #include "moduleAdmin.h"int InitSecondModule();stdef.h
#pragma once#include <stdio.h> #include <Windows.h>#define OK 0 #define ERR -1FirstModule.cpp
#include "FirstModule.h"int FirstModuleProc(){printf("Hello I am First Module\n");return OK; }int InitFirstModule(){RegisterProc(MY_WRITE_MODULE, FirstModuleProc);return OK; }main.cpp
#include "stdef.h" #include "FirstModule.h" #include "SecondModule.h"DWORD WINAPI MyThread(){while(1){ExcuteAllModule();Sleep(1000);} }int TestFunPtr(){InitFirstModule();HANDLE hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)MyThread, NULL, 0, NULL);Sleep(3000);InitSecondModule();Sleep(3000);TerminateThread(hThread, 0);CloseHandle(hThread);return OK; }int main(int argc, int *argv[]){TestFunPtr();getchar();return 0; }moduleAdmin.cpp
#include "moduleAdmin.h"#define MAX_PROC 100int g_iProCnt = 0; //全局的前面加一個g MOUDLE_DATA_S FunList[MAX_PROC] = {0};int RegisterProc(int iModule, pProcFun pFun){if(g_iProCnt == MAX_PROC){return ERR;}FunList[g_iProCnt].iModule = iModule;FunList[g_iProCnt].pFun = pFun;g_iProCnt++;return OK; }//調用注冊的函數 int ExcuteAllModule(){for(int i = 0; i < g_iProCnt; i++){FunList[i].pFun();}return OK; }SecondModule.cpp
#include "SecondModule.h"int SecondModuleProc(){printf("Hello I am Second Module\n");return OK; }int InitSecondModule(){RegisterProc(MY_READ_MODULE, SecondModuleProc);return OK; }?
源碼打包
下載地址:
https://github.com/fengfanchen/CAndCPP/tree/master/CfunctionPtrAndCallBack
總結
以上是生活随笔為你收集整理的C语言工作笔记-对函数指针的进一步认识(与回调函数结合使用,并且对比C++的回调)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java工作笔记-注解的进一步理解
- 下一篇: 软考系统架构师笔记-案例分析重点(一)