版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011068702/article/details/82532482
1 原因
看了open ssl代码里面很多在结构体里面放很多函数指针,然后再来调用,这样比较规范和统一
2 代码实现
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
typedef struct key_info
{
int (*init)(struct key_info *info);
int (*set_name)(struct key_info *info, const char *name);
int (*get_name)(struct key_info *info, char name[], int size);
pthread_mutex_t lock;
char name[128];
int (*fun)(struct key_info *info, int x, int y);
}KeyInfo;
static int init(KeyInfo *info);
static int set_name(KeyInfo *info, const char *name);
static int get_name(KeyInfo *info, char name[], int size);
static int add(int x, int y);
static int add(KeyInfo *info, int x, int y)
{
return x + y;
}
static int init(KeyInfo *info)
{
assert(info != NULL);
memset(info->name, 0, sizeof(info->name));
info->init = init;
info->set_name = set_name;
info->get_name = get_name;
return pthread_mutex_init(&info->lock, NULL);
}
static int set_name(KeyInfo *info, const char *name)
{
assert(name != NULL);
pthread_mutex_lock(&info->lock);
strncpy(info->name, name, sizeof(info->name) - 1);
pthread_mutex_unlock(&info->lock);
}
static int get_name(KeyInfo *info, char name[], int size)
{
assert(name != NULL);
pthread_mutex_lock(&info->lock);
strncpy(name, info->name, size - 1);
*(name + size - 1) = 0;
pthread_mutex_unlock(&info->lock);
}
int main()
{
/** KeyInfo info;
info.fun = add;
printf("add(1 + 8) is %d\n", info.fun(&info, 1, 8));
info.set_name = set_name;
info.get_name = get_name;
info.set_name(&info, "chenyu");
char name[100];
info.get_name(&info, name, sizeof(name));
printf("info.get_name is %s\n", name);
**/
KeyInfo info = {init};
info.init(&info);
const char *name = "chenyu";
info.set_name(&info, name);
char name_buf[100];
printf("sizeof(name_buf[100]) is %d\n", sizeof(name_buf));
info.get_name(&info, name_buf, sizeof(name_buf));
printf("info.get_name is %s\n", name_buf);
return 0;
}
3 运行结果
gcc -g struct.c -o struct
./struct
sizeof(name_buf[100]) is 100
info.get_name is chenyu