引自《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;
}