Я не уверен, что глобальные переменные плохие во всех случаях, но вам действительно нужно усердно работать, чтобы их было очень мало (иначе ваш код не читается).Например, <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, если у вас многопоточная программа, вы обычно должны защищать глобальные данные с некоторым мьютексом (или какой-то другой вид синхронизации или атомарности).Вы можете прочитать этот учебник .