我有一个全局var结构:
typedef struct {
int myvar1;
int myvar2;
int myvar3;
...
int myvar10;
} t_myStruct myGlobalData;
我无法避免这种全局结构,所以我必须使用它。 我有三种选择可以使用它:
将global var“原样”用于任何函数。即:
int myFunc(void) {
myGlobalData.myvar1 = ...
myGlobalData.myvar10 = myGlobalData.myvar5 + ...
}
声明一个本地指针并使用它:
int myFunc(void) {
t_myStruct * p;
p = &myGlobalData;
p->myvar1 = ...
...
p->myvar10 = p->myvar5 + ...
}
使用local var然后复制到global struct:
int myFunc(void) {
t_myStruct localStruct;
localStruct.myvar1 = ...
localStruct.myvar10 = localStruct.myvar5 + ...
myGlobalData = localStruct ;
}
可以解释一下最好的方法是什么,为什么?
答案 0 :(得分:10)
选择更多抽象。如果您可以将参数更改为myFunc
,则进行签名:
int myFunc(t_myStruct *arg)
{
arg->myvar1 = ...
现在函数本身并不依赖于全局变量的存在。对于需要在此struct
类型上运行的任何其他函数也是如此。如果你必须使用全局变量,那么尽可能隔离的使用,即在尽可能少的地方使用全局变量。
如果您无法更改功能签名,我会从您的问题中选择最直接的选项:第一个。只需直接在全局变量上操作。
答案 1 :(得分:2)
在您列出的三个选项中,IMO,第一个是最好的。只需仔细使用全局结构。
第一个和第二个选项几乎完全相同,但是每当你开始不必要地使用指针时,事情就会被混淆,人们往往会犯更多的错误。
第三种选择只是一个坏主意。现在您希望每个函数在完成后都能确保回写数据吗?如果函数A()
和函数B()
都在对全局结构进行编辑,该怎么办? A()
在数据完成时放回数据,然后B()
完成第二次并覆盖A()
的数据?现在你需要额外的保护机制......这只是一个坏主意。