函數指針的使用--回調函數

引自《openssl 編程》
/*random.h*/
#ifndef RANDOM_H
#define RANDOM_H
typedef int callback_random(char *random, int len);
void set_callback(callback_random *cb);
int genarate_random(char *random, int len);
#endif


/*random.cpp*/
#include "random.h"
#include <stdio.h>
#include <string.h>
callback_random *cb_rand = NULL;
static int default_random(char *random, int len)
{
	memset(random, 0x01, len);
	return 0;
}

void set_callback(callback_random *cb = NULL)
{
	cb_rand = cb;
}

int genarate_random(char *random, int len)
{
	if (cb_rand == NULL)
		return default_random(random, len);
	else
		return cb_rand(random, len);//函數名後面加上函數參數,用於傳參
	return 0;
}

/*main.cpp*/
#include "random.h"
#include <string.h>
#define NO_ERROR 0
#define ERROR 1
#define STR_LENGTH 10
static int my_rand(char *rand, int len)
{
	memset(rand, 0x02, len);
	return 0;
}
int main()
{
	char random[STR_LENGTH] = "";
	int ret = NO_ERROR;
	set_callback(my_rand);//函數名象數組名那樣代表首地址
	
	ret = genarate_random(random, STR_LENGTH);
	if (ret != NO_ERROR)
	{
		return -1;
	}
	return 0;
}
注意:在嵌入式系統上,儘量不要採用遞歸的方式來設計程序,否則很容易造成棧溢出。

摘自《專業嵌入式軟件開發  全面走向高質高效編程 電子工業出版社 李雲》
dll_node_t *dll_traverse(dll_t *_p_dll, traverse_call_t _cb, void *_p_arg)
{
    register dll_node_t *p_node = _p_dll->head_;
    if (null == _cb)
    {   
        return 0;
    }
    while ((0 != p_node) && ((*_cb)(_p_dll, p_node, _p_arg)))
    {
        p_node = p_node->next_;
    }
    return p_node;
}


發佈了224 篇原創文章 · 獲贊 8 · 訪問量 28萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章