app.c 和 main.c 之间,在main.c中调用app.c的static变量和函数,需要利用一个结构体结合指针通过传地址的方式间接访问。
app --------------------------------main
struct { int , func()}作为一种通道或载体
直接上一个代码:
/*main.c*/ #include "common.h" int main(void) { int i; unsigned char cp[8]; FUNC_PTR ptrs; use_func(&ptrs); /*get addr of func(pointer)*/ ptrs.pfunc();/*use the member of struct*/ /*get buff and *length*/ memcpy(cp,ptrs.ptr,*ptrs.length); for(i = 0; i < (int)*ptrs.length; i++) printf("%d-0x%02x ",i,cp[i]); printf("\n"); return 0; }
/*app.c*/ #include "common.h" static unsigned char buff[8]; static int len; static void func(void); static void func(void) { unsigned char temp[8] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08}; int i; len = 8; memcpy(buff,temp,len); for(i = 0; i < len; i++) printf("%d-0x%02x ",i,buff[i]); printf("\n"); } void use_func(FUNC_PTR *function) { function->pfunc = func; function->ptr = buff; function->length = &len; }
/*common.h*/ #ifndef _COMMON_H_ #define _COMMON_H_ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> typedef struct structs{ void (*pfunc)(void); unsigned char *ptr; int *length; }FUNC_PTR; extern void use_func(FUNC_PTR *pfunc); #endif
以上三个文件归纳为main.c app.c common.h
结构体里面均为指针,利用一个use_func(FUNC_PTR *pfunc) 进行在app.c 的所有初始化赋值,包括函数指针的指向。
实际上利用如下:
ptrs.pfunc ptrs.ptr ptrs.length 地址 ********** ptrs.pfunc(); memcpy(cp,ptrs.ptr,*ptrs.length);
运行效果如下:
0-0x01 1-0x02 2-0x03 3-0x04 4-0x05 5-0x06 6-0x07 7-0x08 0-0x01 1-0x02 2-0x03 3-0x04 4-0x05 5-0x06 6-0x07 7-0x08
通过static定义,可以通过结构体作为通道基于指针引用。
推广而言,在非static即可直接利用extern引用外部变量或者函数。
但是也可以利用如static的实现方式去处理。
Life is mess, don't let mess mess us.