天天看點

C/C++回調方式系列之一 函數指針和函數回調模式

一、函數指針

1. 函數的定義

return_type function_name(parameter list) {

function_body

}

return_type: 傳回值,函數一定有傳回值,傳回值為用return關鍵字。如果void類型傳回值,則直接調用return即可;

function_name: 函數名稱

parameter list: 參數清單

function_body: 函數執行範式

例如聲明add函數

int add(int a, int b) {return a + b;}

定義傳回值為int的函數,名稱add,參數清單為int類型的a,b,函數執行範式:a + b.

return回a + b的結果

2. 函數指針聲明

return_type (*function_name) (arg0, arg1, arg2, ...);

function_name: 函數名定義為指針類型,即function_name是一個指向函數的指針。

注意,不能定義為

return_type* function_name (arg0, arg1, arg2, ...);

這是傳回值為指針的函數,即傳回結果為指針類型的函數。

3. 第一個函數指針程式

hello_world.cpp

=========================

[cpp] view plain copy

  1. #include <cstdio>  
  2. void function(const char *text) {  
  3.     printf("%s", text);  
  4. }  
  5. int main(void) {  
  6.     void (*pfun)(const char *) = &function;  
  7.     (*pfun)("Hello, world.\n");  
  8.     return 0;  

運作指令編譯 

lucky@lucky-macbook:cplusplus_callback_function$ g++ hello_world.cpp -o hello

lucky@lucky-macbook:cplusplus_callback_function$ ./hello

Hello, world.

二、函數式回調

1. 在c/c++允許函數指針作為函數參數傳遞

例如: void invoke_function(void (*callback_func)(parameter list));

函數invoke_function的參數是函數指針callback_func,對于不熟悉c的開發者一開始會不習慣void (*callback_func)(parameter list)這種聲明變量的方式。這樣聲明變量相當于

#typedef void (*CALLBACK_FUNCTION)(parameter list)

CALLBACK_FUNCTION callback_func;

2. 簡單的回調函數程式

function_callback.cpp

  1. #include <cstring>  
  2. #define TEXT_LEN 128  
  3. /**定義函數lucky*/  
  4. void lucky(char *outName, size_t len) {  
  5.     strncpy(outName, "Hi, I'm lucky.\n", len);  
  6. void jacky(char *outName, size_t len) {  
  7.     strncpy(outName, "Hi, I'm jacky, Nice to meet you.\n", len);  
  8. void penny(char *outName, size_t len) {  
  9.     strncpy(outName, "Just call me penny, I like football.\n", len);  
  10. void introduce(void (*person)(char *, size_t len)) {  
  11.     char szText[TEXT_LEN] = {0};  
  12.     (*person)(szText, TEXT_LEN);  
  13.     printf("%s", szText);  
  14. typedef void (*FUNC_NAME)(char *, size_t);  
  15.     // 直接調用函數指針,注意使用了取位址符号&  
  16.     introduce(&lucky);  
  17.     // 直接定義變量方式使用函數指針  
  18.     void (*pfun)(char *, size_t) = &jacky;  
  19.     introduce(pfun);  
  20.     // 先用typedef定義函數指針類型,再用改類型定義對應的函數指針變量,最後對變量指派并傳參調用  
  21.     FUNC_NAME pfunc2 = &penny;  
  22.     introduce(pfunc2);  

編譯并輸出結果

lucky@lucky-macbook:cplusplus_callback_function$ g++ function_callback.cpp -o funcallback

lucky@lucky-macbook:cplusplus_callback_function$ ./funcallback

Hi, I'm lucky.

Hi, I'm jacky, Nice to meet you.

Just call me penny, I like football.

http://blog.csdn.net/sweettool/article/details/72578801