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