函数指针的使用--回调函数

36 篇文章 1 订阅
8 篇文章 0 订阅
引自《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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值