1.函数指针,一般有两种初始化方式,
第一种是用结构体中的函数指针变量赋值的方式,
第二种是使用专门的函数去注册。
#include<stdio.h>
#include<string.h>
//定义一个函数指针类型(一种新的自定义类型,类似于结构体指针)
typedef int (*getSum)(int a, int b);
//函数指针要指向的函数实体
int function_entity(int a, int b){
return a+b;
}
struct info{
int a;
getSum func;//定义了一个一个函数指针类型的变量,但是没有初始化
};
//注册函数专用 函数, 用于把函数实体和函数指针绑定
void funcRegister(struct info *ln, getSum function_entity){
ln->func = function_entity;
}
int main(){
struct info ln;
int sum = 0 ;
memset(&ln, 0x00, sizeof(ln));
//方式一:直接赋值
ln.a = 100;
//把函数指针指向函数实体,其实性质跟ln.a = 100是一样的
//这里仅仅对结构体进行赋值,但并没有实际调用函数。
ln.func = function_entity;
//调用函数指针指向的函数实体
sum = ln.func(100, 200);
printf("sum = [%d]\n", sum);
//方式一end
//方式二:使用函数去注册(驱动或者协议中常用)
funcRegister(&ln, function_entity); //此时也仅仅是赋值,并没有调用function这个函数!!!
//在这里使用结构体的函数成员变量调用函数实体(实际开发中,常常把此结构体定义成全局变量)
//这样就可以满世界的调用这个函数了,但是也请注意作用域的问题!
sum += ln.func(100, 200);
printf("sum=[%d]\n", sum);
return 0;
}
2.交叉编译中的链接 -lpthread找不到问题
如果Makefile中有专门的链接动作,如果指定了LDFLAGS = -s -lpthread
ld xxx.o xxy.o xxz.o -o $(LDFLAGS)
会提示 cannot find lpthread
但是在测试程序中 aarc-xxx-gcc *.c -lpthread 可以编译通过,烧录开发板也可以执行
一种变相的解决方式是:把ld指定成交叉编译的 g++让编译器帮我们去找这个库。
如果哪位大佬有更好的解决方案,请踢我。