1.回调函数范例一,在VS2010下编译通过
#include "stdafx.h"
#include <stdio.h>
void printWelcome(int len)
{
printf("欢迎欢迎 -- %d\n", len);
}
void printGoodbye(int len)
{
printf("送客送客 -- %d\n", len);
}
void callback(int times, void (* print)(int))
{
int i;
for (i = 0; i < times; ++i)
{
print(i);
}
printf("\n我不知道你是迎客还是送客!\n\n");
}
void main(void)
{
callback(10, printWelcome);
callback(10, printGoodbye);
printWelcome(5);
}
运行结果如下
2.回调函数的范例二,在VS2010 下编译,通过
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include "stdafx.h"
int my_strcmp(char* des, char* src);
static void cmd_hello(void);
static void cmd_hi(void);
static void cmd_exit(void);
//定义一个函数指针
typedef void (*callback)(void);
//定义命令结构体
typedef struct cmd{
char name[10]; //命令的名字
callback func; //与命令相对应的函数指针
}cmd_t;
//然后定义一个命令数组:
//声明命令数组
cmd_t cmd_tbl[] = {
{"hello",cmd_hello},
{"hi",cmd_hi},
{"exit",cmd_exit},
};
// 跟命令相对应的函数为:
//相对应的功能函数为:
void hello(void)
{
printf("hello\n");
}
void hi(void)
{
printf("hi\n");
}
static void cmd_hello(void)
{
hello();
}
static void cmd_hi(void)
{
hi();
}
static void cmd_exit(void)
{
//exit(0);
}
//此时我们还需要一个查找命令函数:
cmd_t* my_find( char* val)
{
int i;
for(i = 0; i < sizeof(cmd_tbl)/sizeof(cmd_tbl[0]); i++){
if(!my_strcmp(val,cmd_tbl[i].name)){
return &cmd_tbl[i];
}
}
return 0;
}
//字符串比较函数
int my_strcmp(char* des, char* src)
{
while(*des){
if(*des != *src)
return 1;
des++;
src++;
}
return *src - *des;
}
//此函数返回的是一个结构体指针,若没有找到命令则返回0;
//main 函数如下:
int main(void){
char val[20] = {};
cmd_t *cmd_ptr;
while(1){
gets(val);
cmd_ptr = my_find(val);
if(cmd_ptr){
cmd_ptr->func();
}
else{
printf("no cmd\n");
}
}
return 0;
}
运行结果: