Хотя вы можете решить вопрос о том, как использовать глобал, гораздо лучше, если вы вообще его избежите. Если у вас есть две функции, которые изменяют одну переменную, то самое простое, что вы можете сделать, - передать переменную в качестве аргумента функции:
void foo( type & var );
void bar( type & var );
int main() {
type t( constructor_argument ); // [1]
// [2] operate on t before calling the functions
foo( t );
// [3] operate some more if needed
bar( t );
// [4] t now has been updated by both foo and bar
}
Если переменную не нужно создавать до первой функции ([1]
не требуется и [2]
не присутствует), тогда вы можете использовать эту переменную в качестве возвращаемого значения функции:
type foo(); // create and return the variable
void bar( type& );
int main() {
type t = foo();
// [3] operate on t
bar( t );
// [4] use the final t
}
Если вам не нужно обновлять переменную после вызова первой функции, а вторая функция фактически не изменяет переменную (она только читает то, что сделала первая функция), и переменная не нужна в main
после выполнение второй функции ([4]
пусто), тогда вы можете изменить сигнатуру второй функции и вообще избежать переменной в main
:
type foo();
void bar( type );
int main() {
bar( foo() );
}
Любое и все решения различных проблем, показанных здесь, намного лучше, чем наличие глобальной переменной, которая используется различными функциями. Когда вы читаете код в main
(или любой другой функции, имеющей логику), становится очевидным, как данные передаются из одной точки в другую. В случае глобальных переменных необходимость вызова foo
перед вызовом bar
не является явной в коде, зависимость от глобального скрыта, если вы не прочитали реализацию функций.
Старайтесь избегать глобальных переменных настолько, насколько это возможно, это сделает ваш код более понятным, легче рассуждать и легче тестировать.