代码之家  ›  专栏  ›  技术社区  ›  Mike

使用全局变量最优雅的方法是什么?

  •  3
  • Mike  · 技术社区  · 6 年前

    几年前我认识到全局变量是不好的,应该避免。但我知道它们有时是不可避免的,至少在嵌入式系统中是如此。你认为和他们一起工作最优雅的方式是什么?

    在我的项目中,我有一个名为 globals.h 在这里我定义了所有的全局变量:

    #ifndef GLOBALS_H
    #define GLOBALS_H
    extern int16_t    gVariable1;
    extern int16_t    gVariable2;
    ….
    #endif
    

    在我的主项目文件中,我声明了所有全局变量:

    /*
    ***********************************************************************
    *                            global variables                         *
    ***********************************************************************
    */
        int16_t     gVariable1 = 0;
        int16_t     gVariable2 = 0;
    
    
    int16_t main (void)
    {
        gVariable1 = 6;
    
        //  do other stuff
    }
    

    我知道我包括 在需要访问全局变量的项目的每个其他文件中。

    2 回复  |  直到 6 年前
        1
  •  3
  •   Basile Starynkevitch    6 年前

    我不确定全局变量在所有情况下都是不好的,但是您确实需要努力使它们很少(否则,您的代码是不可读的)。例如 <stdio.h> stdout ,如果用一些 FILE*get_standard_output(void); getter函数。

    作为经验法则,避免在整个程序中有超过4或5个全局变量(回想一下 magical number seven 作为一个 我们的认知局限性)。

    相关 将全局变量转换为单个 struct 类型。以你的例子来说,这可能意味着 globals.h :

    struct globalstate_st { int16_t v1, v2; };
    

    extern struct globalstate_st gs;
    

    你会用 gs.v1 而不是 gVariable1 ; 如果使用优化编译,使用 相当于使用 G变量1 .

    mutex (或其他某种同步或原子性)。考虑阅读 this pthread tutorial .

        2
  •  2
  •   Jossy Sebastian    6 年前

    全局变量并不危险。这很有帮助。但在最佳实践中,始终保持变量的范围有限。

    例句:在global.c

    static int gMyGlobalVariable;
    
    int getMyGlobalVariableValue()
    {
       return gMyGlobalVariable;
    }
    
    void setMyGlobalVariableValue(int set)
    {
       gMyGlobalVariable = set;
    }
    

    void setMyGlobalVariableValue(int set);
    int getMyGlobalVariableValue();