Re: [問題] 有關callback function使用?

看板C_and_CPP (C/C++)作者 (藍影)時間14年前 (2011/02/21 23:23), 編輯推噓3(303)
留言6則, 5人參與, 最新討論串2/2 (看更多)
※ 引述《breakingdown (Loneliness in Taipei)》之銘言: : 用C語言寫… : 是在trace程式碼時產生的疑問… : 原本寫法是直接呼叫函式, : 但是後來有位前輩將幾個常會呼叫到的函數, : 初始化時先存在一個function pointer arrary裡, : 然後若需用到某一個function就呼叫對應到的function pointer array~ : 看起來就是間接呼叫的感覺… : 不過改成這樣寫有什麼好處嗎?除了版面變簡單外… ^^^^^^^^ 方便維護與修改 : 這就是所謂callback function嗎? ^^^^^^^^^ 其實真的差蠻多的 : 謝謝~ 先說說 function pointer 的東西, 小弟私以為,只有單用 function pointer, 除非是用在傳遞類似像 qsort 這種要自定義比較大小的東西外, 基本上單用沒什麼戰鬥力, 大多都是形成 function pointer array 才看得出它的好處 ----------------- 假設一個簡單的問題, 已知 a,b 二數, 輸入 0: 加法; 輸入 1: 減法; 輸入 2: 除法; 輸入 3: 乘法 如果你是用 if (x==0) add() else if(x==1) sub() else if(x==2) mlu() else if(x==3) div() 或是用 switch-case 方式, 那會很不好維護。假設今天又臨時加了一、二個功能 程式碼可能會是一長串的 if-else,用 function pointer array 會較適合, 也顯得較易修改 程式碼可以參考這裡 http://nopaste.csie.org/97101 (要改的話就改 function pointer array 初值便可) 裡面有一行很少有書提到 (其實我是沒找到有書提到) typedef double(*myFuncPtr)(double, double); // typedef better 這是把 myFuncPtr 定義為一種資料形態,這種資料型態就是 bala bala 的函式指標, 這在製作、調用 dll/lib 時是蠻常看到的, 私以為先定義起來是較好的。 -------------------- 再補一個好了, 其實之前 "私以為" 在 C 裡面, function pointer 是可以 進行 "某種程度" 上 的封裝, ex: typedef struct _tagFile{ void (*Open)(char* filename); void (*Write)(char* buffer); void (*Read)(char* buffer); void (*Close)(); }File; 這樣有什麼好處的話.. 嗯.. 可能去學 C++ 感受會強烈一點 ---------------------- 至於您說的 callback function, 事實上它的運作機制和一般main裡寫的 function 運作機制不同; main 裡面寫的是「主動」去 call 你寫的 function, callback 是「被動」等待某個條件產生才去執行你寫的 function, 這個條件通常指的是訊息的發生。比如說視窗上某個按鈕被按時, 才會去呼叫你寫的函式,便是「被動」等待 user 去按按鈕。 這部份要說絕對說不完,視窗程設本身就屬於一個龐大的機制, 有興趣去摸一下簡單的 win32 程式設計,大致上可以有基本的概念。 -- YouLoveMe() ? LetItBe() : LetMeFree(); -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 180.177.76.142 ※ 編輯: tropical72 來自: 180.177.76.142 (02/21 23:29) ※ 編輯: tropical72 來自: 180.177.76.142 (02/21 23:49)

02/22 00:21, , 1F
blah blah...
02/22 00:21, 1F

02/22 12:22, , 2F
廣義來說,qsort傳 compator 的作法可看成 call-back
02/22 12:22, 2F

02/22 12:43, , 3F
標題叫做 callback 結果裡面講的是 function pointer XD
02/22 12:43, 3F

02/23 00:26, , 4F
你的struct是當作interface用啦google "file_operations"
02/23 00:26, 4F

02/23 00:27, , 5F
linux kernel對driver最基本就是走file_operations的
02/23 00:27, 5F

02/23 01:48, , 6F
實在是太神奇了,謝謝樓上指點.
02/23 01:48, 6F
文章代碼(AID): #1DOeDK9_ (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1DOeDK9_ (C_and_CPP)