Когда можно использовать глобальную переменную в C? - PullRequest
44 голосов
/ 07 октября 2008

Очевидно, что существует множество разных мнений, начиная от " Никогда! Всегда инкапсулируйте (даже если это просто макрос!) " до " Это не страшно - используйте их, когда это удобнее, чем нет."

Зв

Конкретные, конкретные причины (желательно с примером)

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

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

Я полагаю, что для новичков важно иметь такую ​​ссылку, но, пожалуйста, не загромождайте ее, если существует другой ответ, который в значительной степени похож на ваш - добавьте комментарий или отредактируйте ответ другого лица.

-Adam

Ответы [ 15 ]

1 голос
/ 07 октября 2008

Когда вы объявляете константы.

1 голос
/ 07 октября 2008

Глобальные переменные следует использовать, когда нескольким функциям требуется доступ к данным или запись в объект. Например, если вам нужно было передать данные или ссылку на несколько функций, таких как один файл журнала, пул подключений, или ссылку на аппаратное обеспечение, к которой необходимо обращаться через приложение. Это предотвращает очень длинные объявления функций и большое выделение дублированных данных.

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

1 голос
/ 07 октября 2008

Этот инструмент, как и любой другой, обычно злоупотребляют, но я не думаю, что они злые.

Например, у меня есть программа, которая действительно действует как онлайн-база данных. Данные хранятся в памяти, но другие программы могут манипулировать ими. Существуют внутренние подпрограммы, которые во многом похожи на хранимые процедуры и триггеры в базе данных.

Эта программа имеет сотни глобальных переменных, но если подумать, что такое база данных, но огромное количество глобальных переменных.

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

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

0 голосов
/ 21 января 2009

Глобальные константы полезны - вы получаете больше безопасности типов, чем макросы препроцессора, и все равно так же легко изменить значение, если вы захотите.

Глобальные переменные имеют некоторое применение, например, если работа многих частей программы зависит от конкретного состояния конечного автомата. Пока вы ограничиваете количество мест, которые могут ИЗМЕНИТЬ переменную, отслеживающую ошибки, связанные с ней, не так уж и плохо.

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

0 голосов
/ 07 октября 2008

Я нахожусь в лагере "никогда" здесь; если вам нужна глобальная переменная, по крайней мере, используйте singleton pattern . Таким образом, вы получаете преимущества ленивого создания экземпляров и не загромождаете глобальное пространство имен.

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