嵌入式C:全局变量管理器

时间:2015-07-07 08:14:21

标签: c embedded

我想将全局变量封装在一个“数据管理器模块”中。 访问只能通过功能来避免所有丑陋 全局变量问题......因此内容完全隐藏在用户之外。 有没有现有的概念?怎么可能这样的实施 看起来像?如何将值存储在“data-manager-module”中?

3 个答案:

答案 0 :(得分:6)

A"数据管理器模块"没有任何意义。实施一个只会扫除地毯下面一个根本糟糕的程序设计,隐藏它而不是实际清理它。全局变量的主要问题不是用户滥用,而是它们在项目中的模块之间创建紧密耦合,使其难以阅读和维护,并且还增加了错误和升级的可能性。在bug所在的模块之外。

程序中的每个数据都属于某个模块,其中一个"模块"由h文件和相应的c文件组成。称之为模块或类或ADT或任何你喜欢的。常识和OO设计都要求变量需要在它们实际所属的模块中声明,周期。

您可以通过在文件范围static声明变量然后实现setter / getter函数来执行此操作。这是穷人的私人封装"而且不是线程安全的,但对于嵌入式系统,它在大多数情况下都能正常工作。这是声明这些变量的嵌入式行业事实上的标准。

或者更高级,您可以通过在h文件中将结构声明为不完整类型来进行真正的私有封装,并在C文件中定义它。这有时被称为" opaque type"并在对象的基础上给出真正的封装,这意味着您可以声明该类的多个实例。不透明类型也可用于实现继承(虽然以相当繁琐的方式)。

答案 1 :(得分:0)

声明并定义头文件中包含在管理器.c文件中但不包含在其.h文件中的所有变量 这样他们只能看到经理的职能。

答案 2 :(得分:0)

您可以使用getter和setter

将所有变量保存在结构体内的单个源中
static struct all_globals{
  long long myll;
  /* ... */
} all_globals; /* Not _really_ global*/

long long getmyll(void){
  return all_globals.myll;
}

long long setmyll(long long value){
  return all_globals.myll = value;
}

同样,您可以使用未导出到用户API的内部头文件,然后从生成的二进制文件/库中删除符号

/* globals.c */
struct all_globals{
  long long myll;
  /* ... */
} all_globals; /* Not _really_ global*/

/* globals.h */
#define getmyll() all_globals.myll
#define setmyll(value) all_globals.myll = (value)

最终用户在技术上仍然可以通过足够的努力看到它,但是允许您区分全局变量并将它们保持在一起。