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 Set -「LOCAL」冲刺省选 Round XXI

    \(\mathscr{Summary}\)   省选几个小时啊,怎么模拟赛只打三个小时啊./kk   时间安排较为合理,没有出现严重的因思考时间过少引起的丢分.   A 题比较可惜,二分 + 点分治大 ...

  2. 5.Flink实时项目之业务数据准备

    1. 流程介绍 在上一篇文章中,我们已经把客户端的页面日志,启动日志,曝光日志分别发送到kafka对应的主题中.在本文中,我们将把业务数据也发送到对应的kafka主题中. 通过maxwell采集业务数 ...

  3. jmeter分布式导致重复登录的问题、以及写txt、csv、统计行数

    经常收到微信好友的各种问题咨询,今天分享一个比较有代表性的,希望对大家有所帮助. 一位微信好友的提问 问题如下: 问题分析 先简单介绍下服务端的处理逻辑,关于登录,服务端的逻辑一般是:校验用户名.密码 ...

  4. DoS,DDoS,DRoS攻击

  5. 如何制作BI看板报表?汽车保有量看板教程等你来学

    今天给大家分享的是 汽车保有量看板  这张移表的制作过程.   制作工具:Smartbi云报表 Smartbi云报表是一款基于Office Excel的SAAS BI工具,支持在Excel端结合云端数 ...

  6. 控制台console不打印信息的解决办法

    一直用控制台调试,突然不知道怎么回事看不到控制台输出的信息了: 需要检查下面几方面的问题: 1:我的就属于第一个问题,不知道怎么搜索的时候就改变了Filter; 2:确保以上选项是勾选的 3:点击设置 ...

  7. 函数式编程 高阶函数 map&reduce filter sorted

    函数式编程 纯函数:没有变量的函数 对于纯函数而言:只要输入确定,那么输出就是确定的.纯函数是没有副作用的. 函数式编程:允许把函数本身作为参数传入另一个函数,还允许返回一个函数 高阶函数:一个函数的 ...

  8. xsd文件生成cs文件命令

    C:\Windows\System32>xsd.exe c:/Createst.xsd -c C:\Windows\System32>xsd.exe c:/Creauest.xsd /c ...

  9. CV之各种不熟悉但比较重要的笔记

    解析: skip connection 就是一种跳跃式传递.在ResNet中引入了一种叫residual network残差网络结构,其和普通的CNN的区别在于从输入源直接向输出源多连接了一条传递线, ...

  10. LeetCode-019-删除链表的倒数第 N 个结点

    删除链表的倒数第 N 个结点 题目描述:给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点. 进阶:你能尝试使用一趟扫描实现吗? 示例说明请见LeetCode官网. 来源:力扣(Leet ...