在嵌入式系统中使用全局变量的最优雅方式是什么? 几年前,我了解到,全球变量很糟糕,应该避免。但是我知道它们有时是不可避免的,至少在带有中断的嵌入式系统中。您认为什么是...

问题描述 投票:0回答:2

global.h

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

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

main.c

/*
***********************************************************************
*                            global variables                         *
***********************************************************************
*/
    int16_t     gVariable1 = 0;
    int16_t     gVariable2 = 0;


int16_t main (void)
{
    gVariable1 = 6;

    //  do other stuff
}

现在我将

globals.h

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

效果很好,但是有一种更优雅的方法来处理吗?
	
我不确定在所有情况下,全局变量都不好,但是您确实需要努力工作才能拥有很少的变量(否则,您的代码在不可读中)。例如,

<stdio.h>

stdout

,如果用某些

FILE*get_standard_output(void);

getter函数替换它不会更好。
c embedded global-variables coding-style
2个回答
3
投票
的数字为第7位)。

,但是,您可以打包(巧妙且品味良好,以使您的代码可读)几个

链式变量添加到
struct
类型的单个变量中。以您的示例,这可能意味着您的
globals.h

struct globalstate_st { int16_t v1, v2; };

extern struct globalstate_st gs; 您将使用

gs.v1

而不是gVariable1;如果您对优化进行编译,则使用

gs.v1
的性能等同于使用
gVariable1
.

BTW,如果您有多线程程序,则通常应使用一些
mutex

(或其他类型的同步或原子能)保护全局数据。考虑阅读this pthread教程

.
    

全球变量并不危险。它有帮助。但是最佳实践,请始终保持可变限制的范围。 
设置具有静态和公开函数的全局变量以获取和设置值。 
EG:在Global.c
static int gMyGlobalVariable;

int getMyGlobalVariableValue()
{
   return gMyGlobalVariable;
}

void setMyGlobalVariableValue(int set)
{
   gMyGlobalVariable = set;
}

EG:在Global.h

void setMyGlobalVariableValue(int set); int getMyGlobalVariableValue(); 这将更好地控制多线程的情况。


2
投票
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.