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

static变量和函数如何巧妙调用的更多相关文章

  1. java static变量及函数

    java以类为基础,没有游离在类之外单独存在的变量.所以,c++中的全局变量,在java中应该是不存在的.java中有的是成员变量和成员方法.当成员前以static修饰时,即为静态成员变量或静态成员方 ...

  2. python文件之间变量和函数的 获取/调用 的方法

  3. c++,static 静态成员变量 / 静态成员函数

    静态成员变量: //静态成员变量(static) // //1.如果想在同类的多个对象之间实现数据共享 ,可以用静态 //成员变量,即用static修饰的成员变量,例 static int a; // ...

  4. static变量和static函数

    在C语言编程中,static的一个作用是信息屏蔽! 比方说,你自己定义了一个文件 -- 该文件中有一系列的函数以及变量的声明和定义! 你希望该文件中的一些函数和变量只能被该文件中的函数使用,那么,你可 ...

  5. 成员函数内定义static变量(不安全,各对象之间共享)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/u012317833/article/de ...

  6. JavaScript函数定义和调用 变量作用域

     本文是笔者在看廖雪峰老师JavaScript教程时的个人总结   JavaScript中函数定义可以是这样的格式 function 函数名(参数) {     函数体 } 也可以是这样的格式     ...

  7. c++ 类与函数中static变量初始化问题(转)

    首先static变量只有一次初始化,不管在类中还是在函数中..有这样一个函数: void Foo() { ; // initialize std::cout << a; a++; } 里的 ...

  8. 用static声明的函数和变量小结

    static 声明的变量在C语言中有两方面的特征: 1).变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值.这一点是它与堆栈变量和堆变量的区别. 2).变量用static ...

  9. C++ static 静态变量&静态成员函数

    .h文件中定义 static变量后,如 static QTcpSocket * socket; 那么一定要在.cpp中 构造函数的外面将其初始化为 QTcpSocket * Cfiletransfer ...

随机推荐

  1. Solution -「CF 1586F」Defender of Childhood Dreams

    \(\mathcal{Description}\)   Link.   定义有向图 \(G=(V,E)\),\(|V|=n\),\(\lang u,v\rang \in E \Leftrightarr ...

  2. suse 12 双网卡bonding模式

    文章目录 工欲善其事,必先配静态ip 网卡bonding eth0 eth1 192.168.70.52 192.168.70.55 工欲善其事,必先配静态ip 重要的事情说三遍 修改配置之前,先备份 ...

  3. 看我如何使用 shell 来获取所有 KVM 虚拟机的 IP 地址

    文章目录 脚本说明 脚本展示 效果展示 此脚本的初衷是因为,KVM创建的桥接网卡的虚拟机,无法使用virsh domifaddr命令获取IP,而创建的nat网卡的虚拟机,则可以直接使用virsh do ...

  4. c++ istream_iterator ostream_iterator

    istream_iterator/ostream_iterator void stream_iter_odd_even(const string &in_file, const string ...

  5. 定制Centos7.9镜像

    Ps:因为工作内容:有一部份是需要重装系统:系统版本镜像为centos7.9.可每次装完都需要下载一些基础包:最近因为设备过多:网卡名称太乱:导致做后续配置太繁琐:不规整:索性自己定制个系统: 搭建基 ...

  6. JVM学习——垃圾回收GC(学习过程)

    JVM学习-垃圾回收(GC) 2020年02月19日06:03:56,开始学习垃圾回收,学习资料来源(张龙老师的JVM课程) JVM内存数据区域知识复习 学习垃圾回收之前,要对JVM内部的内存区域有详 ...

  7. SIMD编码/解码

    在看SEAL库和HElib库中经常在编码中碰到打包(batch)技术,另外还提到了SIMD编码技术,有点困惑,编码.打包.SIMD到底有什么关系? 编码 在CKKS方案中,因为明文空间在复数域上,简单 ...

  8. 盘点Go中的开发神器

    本文已收录 https://github.com/lkxiaolou/lkxiaolou 欢迎star. 在Java中,我们用Junit做单元测试,用JMH做性能基准测试(benchmark),用as ...

  9. WPS:从某一页开始编号,并且奇数页偶数页页眉页脚的页码位置不同

    1.开始页的页眉页脚同时取消勾选"同前页" 此后,这一页就是以后所有页的第一页了 2.删去开始页之前所有的页眉页脚 3.页眉页脚选项中,设置奇偶页不同,其它都不用设置

  10. python面试_总结04_字符串练习题

    完成下列列表相关的编程题,先运行下列的test函数,在完成每道题之后,都可以通过调用test函数检测所写函数对错 def test(got, expected): if got == expected ...