Когда следует использовать переменные или общие переменные? - PullRequest
0 голосов
/ 04 мая 2019

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

int main(){
int x;
}

И когда использовать публичную переменную, подобную этой.

int x;

int main(){
}

Переменная области видимости является единственной доступной в функции, в которой она объявлена, а общедоступная переменная - доступной для всего файла. Не могли бы вы помочь мне понять, когда использовать это?

Ответы [ 2 ]

1 голос
/ 04 мая 2019

Задайте вам эти вопросы,

Вы собираетесь использовать x только в основной функции? Собираетесь ли вы передать х в качестве параметра в подфункции сети? Тогда это должно быть ограничено. Создатели модульного программирования будут рады видеть это

Ваше приложение состоит из множества файлов? Является ли x чем-то (например, глобальным состоянием), которое нужно вашему приложению во всех этих файлах? Тогда x следует сохранить глобальным (в заголовочном файле, как рекомендуется), чтобы его можно было использовать как extern в других файлах.

Если вы только начинаете писать приложение: Если вы начинаете x как переменную области видимости и в конечном итоге передаете ее в каждую функцию по всем файлам, вам следует изменить ее как глобальную область видимости

Если ваше приложение уже разработано и x добавляется в качестве новой функциональности: Тогда вы уже должны знать, что x представляет глобальное состояние или нет.

0 голосов
/ 04 мая 2019

Вот простое правило: объявляйте переменную в самой узкой области, в которой вы будете ее использовать.


Что касается объяснения , почему : в C и C ++ (и других языках) переменные по сути "перестают существовать", когда они выходят из области видимости. Если вы объявляете переменную вне функции, эта переменная обрабатывается и сохраняется в памяти перед вызовом функции. Каждый раз, когда вы вызываете функцию и используете эту переменную, к ней обращается один и тот же бит памяти, и в результате переменная сохраняет свое значение между вызовами.

Между тем, если вы объявите переменную внутри функции (например, в C / C ++, я думаю, что что-либо с фигурными скобками в ней определяет более узкую область видимости), она будет выделена и сохранена в памяти только когда это входит в сферу . Когда эта область заканчивается (например, с помощью оператора return в конце метода), освобождается вся память, которая была в этой области.

Все это связано со стеком , который является одним из двух основных способов обработки динамической памяти в C и C ++. Вот полезный обзор того, как программы на C распределяют память ; достаточно сказать, что приведенные выше эмпирические правила заключаются в том, что

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