static 的使用
static 的常用场景
- 智能网关项目:zigbee ble wifi模块的同事都需要用日志打印的函数,如何设计一个日志打印函数给他们使用?
ZigBee、BLE和WiFi是三种常见的无线通信模块。这些模块用于构建物联网设备,使设备能够进行无线通信。
- ZigBee是一种低功耗、低成本的无线局域网协议。它基于IEEE 802.15.4标准,适用于短距离通信。ZigBee模块可以实现多种ZigBee规范网络通信功能。
- BLE(Bluetooth Low Energy) 是一种低功耗、短距离、可互操作的无线技术。它是蓝牙协议的标准版本,适用于低功耗设备。BLE模块可以实现智能设备之间的无线通信。
- WiFi(Wireless Fidelity)是一种基于IEEE 802.11标准的无线局域网连接技术。它使用2.4GHz和5GHz频段,可以实现高速的无线网络连接。
详细见:https://zhuanlan.zhihu.com/p/415436445
- 点餐屏:统计损耗(打印机)模块的使用次数。
把static当与面对对象语言中的private来使用(限制作用域)
static 可以当做java或者cpp中的private来使用,比如下面的代码中,我们在test.h中定义了一个void test(void)方法(类似面对对象中的抽象类),随后我们在static.c中实现test方法,static.c文件中不直接写test方法,而是写了一个test_print方法,之后再用test方法调用test_print方法。你会好奇这有什么作用? 其实如果学过面对对象语言就知道它的作用。我们来假设一下,如果我们test方法里面会调用方法1和方法2,如果我们不把方法1和方法2前面加上static,那么别人可以直接不通过test方法调用来执行全部的方法1和方法2,而是直接调用方法1或者方法2中其中一个,那么这个代码就非常不安全。你可能会想那我把方法1和方法2直接写在test方法中不就行了?那如果方法1和方法2会被多个方法调用到呢,你岂不是要不停的写重复代码?其次如果你方法1和方法2写在一起也不方便之后的代码维护,假设他们的代码量很大。
代码如下
test.h
// test.h
#ifndef _TEST_H_
#define _TEST_H_
void test(void);
#endif
static.c
#include<stdio.h>
#include "test.h"
static void test_print(){
printf("test_print \n");
}
void test(){
test_print();
}
test.c
#include <stdio.h>
#include "test.h"
void main(){
test();
}
我们在test.c所处文件下打开终端命令行输入:
gcc .\test.c .\static.c -o .\test
这里需要注意如果不使用命令行而直接使用vscode来直接执行test.c文件会报错,主要原因在于test.c中的test方法需要static.c中的实现,而编译器又是根据文件名的排序顺序来进行编译的,那么如果static.c文件在test.h上面,会导致编译不到就会报错。
执行完上面的代码后,我们会获得一个test.exe文件,我们直接在命令行中执行这个exe即可
.\test.exe
得到输出 test_print
全局变量使用
统计打印机模块的使用次数时,我们可以用static来声明变量count,之后count会在整个程序关闭之前都保持全局变量的使用。
代码
void func(void){
static int count = 0;
count++;
printf("count为%d", count);
}
当我们别的方法想要看看打印机已经使用了几次,可以直接调用func函数来进行查看。