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的实现方式去处理。