Какой самый элегантный способ работы с глобальными переменными? - PullRequest
0 голосов
/ 26 октября 2018

Пару лет назад я узнал, что глобальные переменные плохие и их следует избегать.Но я знаю, что они иногда неизбежны, по крайней мере, во встроенной системе.Как вы думаете, какой самый элегантный способ работы с ними?

В моих проектах у меня есть файл с именем 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
}

И знаю, что я включаю globals.h во все остальные файлы проекта, которым требуется доступ к глобальной переменной.

Это прекрасно работает,но есть ли более элегантный способ справиться с этим?

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Глобальные переменные не опасны.Это поможет.Но передовой практикой всегда ограничивайте область действия переменной.

Установите глобальную переменную со статической функцией и выставьте функцию для получения и установки значения.

Например: в global.c

static int gMyGlobalVariable;

int getMyGlobalVariableValue()
{
   return gMyGlobalVariable;
}

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

Например: в global.h

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

Это даст лучший контроль в многопоточной ситуации.

0 голосов
/ 26 октября 2018

Я не уверен, что глобальные переменные плохие во всех случаях, но вам действительно нужно усердно работать, чтобы их было очень мало (иначе ваш код не читается).Например, <stdio.h> имеет stdout, и было бы не лучше, если бы его заменили на какую-нибудь FILE*get_standard_output(void); функцию получения.

Как правило, избегайте использования более 4 или 5 глобальных переменных.во всей вашей программе (вспомните магическое число семь как подсказку о наших когнитивных ограничениях).

Однако вы могли бы упаковать (умно и с хорошим вкусом, чтобыобеспечьте читабельность вашего кода) несколько связанных глобальных переменных в один тип struct.В вашем примере это может означать в вашем globals.h:

struct globalstate_st { int16_t v1, v2; };

затем

extern struct globalstate_st gs;

, и вы будете использовать gs.v1 вместо gVariable1;если вы компилируете с оптимизацией, производительность использования gs.v1 эквивалентна использованию gVariable1.

BTW, если у вас многопоточная программа, вы обычно должны защищать глобальные данные с некоторым мьютексом (или какой-то другой вид синхронизации или атомарности).Вы можете прочитать этот учебник .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...