静态库中使用回调函数(二)

12 篇文章 0 订阅

本篇使用了结构体,对回调函数进行了初始化等操作,并完善了Makefile,


1、回调函数就是函数指针,传入参数可以使用函数指针。

2、库中提供接口,库中调用,有使用库者去实现功能。

3、例子有三个并行文件夹:src ,app,lib。

文件夹src含有文件:function.c includes.h Makefile

文件function.c

#include "includes.h"
//我们需要创建一个“库函数”,这个函数以函数指针为参数,通过它来调用不同的函数:

/****************************************
 * 库函数
 ***************************************/
float add_sub_mul_div(float a, float b, float (*op_func)(float, float))
{
    return (*op_func)(a, b);
}

文件includes.h

#ifndef __INCLUDES__H__
#define __INCLUDES__H__

#include <stdio.h>
#include <stdlib.h>
/****************************************
 * 函数指针结构体
 ***************************************/
typedef struct _OP {
    float (*p_add)(float, float); 
    float (*p_sub)(float, float); 
    float (*p_mul)(float, float); 
    float (*p_div)(float, float); 
} OP; 

float add_sub_mul_div(float a, float b, float (*op_func)(float, float));

#endif


文件Makefile
# The C program compiler.
CC=gcc 
AR=ar

#COMPILE.c   = $(CC)  $(MY_CFLAGS) $(CFLAGS)   $(CPPFLAGS) -c
COMPILE.c=$(CC) -Wall -c

all: libapi

libapi:function.o 
	$(AR) crv ../lib/libapi.a ../src/*.o

# Rules for generating object files (.o).
#----------------------------------------
#objs:$(OBJS)

%.o:%.c	
	$(COMPILE.c) $< -o $@ 

clean:
	rm -rf *.o
	cd ../lib/;rm -rf *.a


文件夹app含有文件:main.c main.h Makefile

文件main.c

#include "main.h"

//要完成加减乘除,我们需要定义四个函数分别实现加减乘除的运算功能,这几个函数就是:

/****************************************
 * 加减乘除函数
 ***************************************/
float ADD(float a, float b) 
{
    return a + b;
}

float SUB(float a, float b) 
{
    return a - b;
}

float MUL(float a, float b) 
{
    return a * b;
}

float DIV(float a, float b) 
{
    return a / b;
}

/****************************************
 * 初始化函数指针
 ***************************************/
void init_op(OP *op)
{
    op->p_add = ADD;
    op->p_sub = SUB;
    op->p_mul = &MUL;
    op->p_div = &DIV;
}
//我们就可以开始调用回调函数了:
int main()
{
        OP *op = (OP *)malloc(sizeof(OP)); 
        init_op(op);
        
  
	/* 调用回调函数 */ 
printf("ADD = %f, SUB = %f, MUL = %f, DIV = %f\n", 
        add_sub_mul_div(1.3, 2.2, op->p_add), 
        add_sub_mul_div(1.3, 2.2, op->p_sub), 
        add_sub_mul_div(1.3, 2.2, MUL), 
        add_sub_mul_div(1.3, 2.2, DIV));
             free(op);
        return 0;
}

文件main .h  
#ifndef __MAIN__H__
#define __MAIN__H__

#include "../src/includes.h"

#endif


文件Makefile
TOP_DIR = ..

SRC_DIR		=${TOP_DIR}/src

SRC = ${wildcard ${shell pwd}/*.c} 

OBJ = ${patsubst %.c, %.o, ${SRC}}

#OBJECTS = $(OBJ) ../lib/libapi.a

#如果make执行时,有“-I”或“--include-dir”参数,那么make就会在这个参数所指定的目录下去寻找。
INC_DIR=  -I${SRC_DIR}

		 
CC		=	gcc
TARGET 	        =	myapp
RM		=	rm
CCFLAGS	=-g -Wall $(INC_DIR)



all:$(OBJ)
	cd ../src/;make clean;make
	$(CC) $(OBJ) ../lib/libapi.a -o $(TARGET) -lpthread
	

clean:
	-$(RM) -rf *.o $(TARGET)
	
	
中间生成的库存放在lib文件中,生成的可执行程序在文件app中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值