在C中最好地使用全局结构变量

时间:2012-09-18 16:13:48

标签: c struct global-variables

我有一个全局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 ;
    }
    

可以解释一下最好的方法是什么,为什么?

2 个答案:

答案 0 :(得分:10)

选择更多抽象。如果您可以将参数更改为myFunc,则进行签名:

int myFunc(t_myStruct *arg)
{
    arg->myvar1 = ...

现在函数本身并不依赖于全局变量的存在。对于需要在此struct类型上运行的任何其他函数也是如此。如果你必须使用全局变量,那么尽可能隔离的使用,即在尽可能少的地方使用全局变量。

如果您无法更改功能签名,我会从您的问题中选择最直接的选项:第一个。只需直接在全局变量上操作。

答案 1 :(得分:2)

在您列出的三个选项中,IMO,第一个是最好的。只需仔细使用全局结构。

第一个和第二个选项几乎完全相同,但是每当你开始不必要地使用指针时,事情就会被混淆,人们往往会犯更多的错误。

第三种选择只是一个坏主意。现在您希望每个函数在完成后都能确保回写数据吗?如果函数A()和函数B()都在对全局结构进行编辑,该怎么办? A()在数据完成时放回数据,然后B()完成第二次并覆盖A()的数据?现在你需要额外的保护机制......这只是一个坏主意。