本篇使用了结构体,对回调函数进行了初始化等操作,并完善了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
# 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
文件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
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中。