项目中全局变量应对策略

Posted strongerHuang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了项目中全局变量应对策略相关的知识,希望对你有一定的参考价值。

关注+星标公众号,不错过精彩内容


作者 | Marc Pony
链接:https://blog.csdn.net/maple_2014/article/details/109541104

1、设计函数以传递指针类型的参数

全局变量满天飞的代码:

typedef struct MotionParameters

 float a;
 float b;
 float c;
MP;
MP g_MPData;

void fun0(void)

 g_MPData.a = 0;

void fun1(void)

 g_MPData.b = 1;
 fun0();

void fun2(void)

 g_MPData.c = 2;
 fun1();

void main(void)

 fun2();

设计函数以传递指针类型的参数,无需使用全局变量:

typedef struct MotionParameters

 float a;
 float b;
 float c;
MP;

void fun0(MP *p)

 p->a = 0;

void fun1(MP *p)

 p->b = 1;
 fun0(p);

void fun2(MP *p)

 p->c = 2;
 fun1(p);

void main(void)

 MP MPData;
 fun2(&MPData);

2、 定义一个函数以获取/设置静态局部变量,其作用域限定于该函数,实现类似全局变量的效果,将全局变量隐藏起来

3、在一个.c文件里定义静态全局变量,其作用域限定于该文件,在该文件下定义初始化/获取/设置该静态全局变量的函数,在对应的.h文件里对初始化、获取、设置函数进行声明,实现类似全局变量的效果,将全局变量隐藏起来

方法2,3的源代码如下:

globals.h定义SET/GET宏及对初始化、获取、设置函数的声明。

#ifndef _H_GLOBALS_H
#define _H_GLOBALS_H

#define SET 1
#define GET 0
typedef struct MotionParams

 float a;
 float b[2];
MP;

void initial_xxx(void);
MP *get_or_set_xxx(MP* p, int flag);

void init_motion_params(void);
MP *get_motion_params(void);
void set_motion_params(MP* p);

#endif

globals.c定义静态全局变量,定义初始化、获取、设置静态局部变量/静态全局变量的函数。

#include <memory.h>
#include "globals.h"

//初始化值
void initial_xxx(void)

 MP MPDataTemp; //临时结构体,如果结构体较大时,可以考虑用malloc创建一个

 MPDataTemp.a = 0.0;
 MPDataTemp.b[0] = 0.0;
 MPDataTemp.b[1] = 0.0;
 get_or_set_xxx(&MPDataTemp, SET);


//获取或设置值
//(1)形参用结构体指针,可以有效避免分配过大的栈空间导致栈溢出(结构体有可能很大)
MP *get_or_set_xxx(MP* p, int flag)

 static MP s_MPData;  //静态局部变量,作用域只在本函数,存储于全局数据区,内存空间较栈空间大得多

 if (flag == SET)
 
  memcpy(&s_MPData, p, sizeof(MP));
 
 return &s_MPData;



static MP sg_MPData;//静态全局变量,作用域只在本文件

//初始化值
void init_motion_params(void)

 sg_MPData.a = 0.0;
 sg_MPData.b[0] = 0.0;
 sg_MPData.b[1] = 0.0;


//获取值
MP *get_motion_params(void)

 return &sg_MPData;


//设置值
//(1)形参用结构体指针,可以有效避免分配过大的栈空间导致栈溢出(结构体有可能很大)
void set_motion_params(MP* p)

 memcpy(&sg_MPData, p, sizeof(MP));

test.c用于测试:

  • (1)静态局部变量+init/set/get函数实现类似全局变量功能

  • (2)静态全局变量+init/set/get函数实现类似全局变量功能

#include <stdlib.h>
#include <memory.h>
#include "globals.h"

void main(void)

 MP MPData, MPData2, *p = NULL;

 //(1)静态局部变量+init/set/get函数实现类似全局变量功能
 initial_xxx();

 MPData.a = 1.0;
 MPData.b[0] = 2.0;
 MPData.b[1] = 3.0;
 get_or_set_xxx(&MPData, SET);

 memcpy(&MPData2, get_or_set_xxx(NULL, GET), sizeof(MP));  //将静态局部结构体拷贝
 //p = get_or_set_xxx(NULL, GET);  //指针操作可以直接修改静态局部结构体的变量,不好管理(修改静态局部结构体的变量只通过函数get_or_set_xxx),所以不采用此方式


 //(2)静态全局变量+init/set/get函数实现类似全局变量功能
 init_motion_params();

 memcpy(&MPData, get_motion_params(), sizeof(MP));  //将静态全局结构体拷贝

 MPData.a = 4.0;
 MPData.b[0] = 5.0;
 MPData.b[1] = 6.0;

 set_motion_params(&MPData);

 memcpy(&MPData2, get_motion_params(), sizeof(MP));
 // p = get_motion_params(); //指针操作可以直接修改静态全局结构体的变量,不好管理(修改静态全局结构体的变量只通过函数set_motion_params),所以不采用此方式
------------ END ------------关注公众号回复“加群”按规则加入技术交流群,回复“1024”查看更多内容。


点击“阅读原文”查看更多分享。

以上是关于项目中全局变量应对策略的主要内容,如果未能解决你的问题,请参考以下文章

从医疗图像识别看算法伦理存在的不可避免及应对策略

项目风险的应对方式

我听说全局变量不好,我应该使用啥替代解决方案?

如何应对网站反爬虫策略?如何高效地爬大量数据

为什么全局变量不好?[翻译]

为啥使用全局变量类(单例)是不好的做法? [复制]