C语言:多个全局变量的开发规范

介绍

嵌入式严禁大量零散全局变量!

// 禁止!!!垃圾代码
int temp;
int humi;
int fan_flag;
int timer_count;
int sample_interval;

正确规范:用 结构体 把所有全局变量打包成 一个结构体变量。

开发规范

1. 防止全局变量泛滥

  • 变量多了,不知道谁改的
  • 调试极难
  • 容易被意外篡改导致死机

2. 防止多线程冲突

结构体统一管理,方便加锁

3. 方便保存到 Flash / 固件升级

直接存整个结构体,不用一个个变量存

4. 代码可读性提升 10 倍

别人一看就知道:
这是一个模块的所有配置/状态

例子

结构体聚合全局变量

1. 定义头文件

创建文件,如:global_var.h,内容如下:

#ifndef __GLOBAL_VAR_H__
#define __GLOBAL_VAR_H__
#include <stdint.h>
// 定义结构体
typedef struct {
    float temp;
    float humi;
} Sht40Stat_t;

// 对外接口
const Sht40Stat_t* GlobalVar_Get_Sht40Stat(void);
int GlobalVar_Set_Sht40_TempHumi(float temp, float humi);
int GlobalVar_Set_Sht40(const Sht40Stat_t* stat);
#endif

定义结构体 Sht40Stat_t,与之相关的所有全局变量放在结构体中

2. 实现

创建文件,如:global_var.c,内容如下:

#include "global_var.h"

// 唯一静态全局变量
static Sht40Stat_t g_sht40Stat;

const Sht40Stat_t* GlobalVar_Get_Sht40Stat(void)
{
    return &g_sht40Stat;
}
int GlobalVar_Set_Sht40_TempHumi(float temp, float humi)
{
    g_sht40Stat.temp = temp;
    g_sht40Stat.humi = humi;
    return 0;
}
int GlobalVar_Set_Sht40(const Sht40Stat_t* stat)
{
    g_sht40Stat = *stat;
}

在别的文件调用

第一步:包含头文件

#include "global_var.h"   // 👈 必须加这一行

第二步:修改变量

GlobalVar_Set_Sht40_TempHumi(temp,humi);
// 1. 定义一个新配置
Sht40Stat_t new_stat = {
    .temp = 28.0f,
    .humi = 60.0f,
    .fan_enable = 1,
    .sample_ms = 1000,
};

// 2. 调用设置函数
GlobalVar_Set_Sht40(&new_stat);

第三步:读取变量

// 读取配置
const AgriConfig_t *cfg = Agri_GetConfig();

// 然后就能用里面的参数
float temp = cfg->temp;
uint32_t time = cfg->sample_ms;

总结

  1. 禁止零散全局变量
  2. 同类变量打包成结构体
  3. 用 static 私有化全局结构体
  4. 对外只提供读/写函数接口