static变量和函数如何巧妙调用
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变量和函数如何巧妙调用的更多相关文章
- java static变量及函数
java以类为基础,没有游离在类之外单独存在的变量.所以,c++中的全局变量,在java中应该是不存在的.java中有的是成员变量和成员方法.当成员前以static修饰时,即为静态成员变量或静态成员方 ...
- python文件之间变量和函数的 获取/调用 的方法
- c++,static 静态成员变量 / 静态成员函数
静态成员变量: //静态成员变量(static) // //1.如果想在同类的多个对象之间实现数据共享 ,可以用静态 //成员变量,即用static修饰的成员变量,例 static int a; // ...
- static变量和static函数
在C语言编程中,static的一个作用是信息屏蔽! 比方说,你自己定义了一个文件 -- 该文件中有一系列的函数以及变量的声明和定义! 你希望该文件中的一些函数和变量只能被该文件中的函数使用,那么,你可 ...
- 成员函数内定义static变量(不安全,各对象之间共享)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/u012317833/article/de ...
- JavaScript函数定义和调用 变量作用域
本文是笔者在看廖雪峰老师JavaScript教程时的个人总结 JavaScript中函数定义可以是这样的格式 function 函数名(参数) { 函数体 } 也可以是这样的格式 ...
- c++ 类与函数中static变量初始化问题(转)
首先static变量只有一次初始化,不管在类中还是在函数中..有这样一个函数: void Foo() { ; // initialize std::cout << a; a++; } 里的 ...
- 用static声明的函数和变量小结
static 声明的变量在C语言中有两方面的特征: 1).变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值.这一点是它与堆栈变量和堆变量的区别. 2).变量用static ...
- C++ static 静态变量&静态成员函数
.h文件中定义 static变量后,如 static QTcpSocket * socket; 那么一定要在.cpp中 构造函数的外面将其初始化为 QTcpSocket * Cfiletransfer ...
随机推荐
- Solution -「CF 1586F」Defender of Childhood Dreams
\(\mathcal{Description}\) Link. 定义有向图 \(G=(V,E)\),\(|V|=n\),\(\lang u,v\rang \in E \Leftrightarr ...
- suse 12 双网卡bonding模式
文章目录 工欲善其事,必先配静态ip 网卡bonding eth0 eth1 192.168.70.52 192.168.70.55 工欲善其事,必先配静态ip 重要的事情说三遍 修改配置之前,先备份 ...
- 看我如何使用 shell 来获取所有 KVM 虚拟机的 IP 地址
文章目录 脚本说明 脚本展示 效果展示 此脚本的初衷是因为,KVM创建的桥接网卡的虚拟机,无法使用virsh domifaddr命令获取IP,而创建的nat网卡的虚拟机,则可以直接使用virsh do ...
- c++ istream_iterator ostream_iterator
istream_iterator/ostream_iterator void stream_iter_odd_even(const string &in_file, const string ...
- 定制Centos7.9镜像
Ps:因为工作内容:有一部份是需要重装系统:系统版本镜像为centos7.9.可每次装完都需要下载一些基础包:最近因为设备过多:网卡名称太乱:导致做后续配置太繁琐:不规整:索性自己定制个系统: 搭建基 ...
- JVM学习——垃圾回收GC(学习过程)
JVM学习-垃圾回收(GC) 2020年02月19日06:03:56,开始学习垃圾回收,学习资料来源(张龙老师的JVM课程) JVM内存数据区域知识复习 学习垃圾回收之前,要对JVM内部的内存区域有详 ...
- SIMD编码/解码
在看SEAL库和HElib库中经常在编码中碰到打包(batch)技术,另外还提到了SIMD编码技术,有点困惑,编码.打包.SIMD到底有什么关系? 编码 在CKKS方案中,因为明文空间在复数域上,简单 ...
- 盘点Go中的开发神器
本文已收录 https://github.com/lkxiaolou/lkxiaolou 欢迎star. 在Java中,我们用Junit做单元测试,用JMH做性能基准测试(benchmark),用as ...
- WPS:从某一页开始编号,并且奇数页偶数页页眉页脚的页码位置不同
1.开始页的页眉页脚同时取消勾选"同前页" 此后,这一页就是以后所有页的第一页了 2.删去开始页之前所有的页眉页脚 3.页眉页脚选项中,设置奇偶页不同,其它都不用设置
- python面试_总结04_字符串练习题
完成下列列表相关的编程题,先运行下列的test函数,在完成每道题之后,都可以通过调用test函数检测所写函数对错 def test(got, expected): if got == expected ...