我对避免全局变量的话题进行了长期而认真的研究,并提出了一种我在搜索中从未真正见过的方法,这让我相信这可能不是一个很好的方法(或者我的搜索措辞不正确)。
作为一个例子,我有这样的事情:
int16_t DataProcessing(uint8_t CallType, struct DataStruct *DataIO)
{
int16_t RetVal;
static struct DataStruct StaticDataStuct;
switch (CallType)
{
case FIRSTCASE: RetVal = FirstCaseProcessing(&StaticDataStuct,DataIO); break;
case SECONDCASE: RetVal = SecondCaseProcessing(&StaticDataStuct,DataIO); break;
...
etc
...
}
return RetVal;
}
int16_t FirstCaseProcessing(struct DataStruct *StaticData, struct DataStruct *NewData)
{
// Do what you need to do here
}
对于被调用的任何其他例程,同样的想法。
我还完成了调用 DataProcessing() 的包装函数,这使得整个事情更容易阅读,并且对于将来使用它的新人来说更容易。因此,例如:
int16_t FirstCase(uint8_t Address, uint16_t Data)
{
struct DataStruct NewData;
NewData.Address = Address;
NewData.Data= Data;
return DataProcessing(FIRSTCASE, &NewData);
}
所以,看起来不错的是,除了 UART 和定时器等中断之外,我根本没有全局变量。(我仍然认为尽可能快地进入和退出中断比让中断调用将数据存储在某个静态变量中要好,但很高兴被说服。)
[也许] 不好的是,为了避免全局变量并使其更具可读性,我通过三个函数传递东西(假设不仅仅是我发现它可读!)
我会说,我得到了一个 72MHz 嵌入式 32 位处理器来完成一个 8 位处理器可以完成的工作,运行速度只有一小部分(假设它有足够的 RAM)。所以速度不是问题,尽管我对在速度可能更成问题时这是否是一种好的风格感兴趣。
我已经看到了具有 .c 文件和具有静态变量的 C++ 风格,该 .c 文件中的任何函数都可以看到和访问(但外部文件不能),使用访问器函数将值/指针等传入和传出,但它们似乎使用我认为对文件“全局”的变量(或文件的本地变量,具体取决于您如何看待它!)。此外,可以有一个函数存储一个静态变量,然后简单地将指向该静态变量的指针传递给任何想要访问它的东西。我想知道这是否会成为OTT?
我的想法看起来好/坏/可怕吗?
非常感谢您的任何建议和所有 TL;我可能会得到的 DR。;~)