Строитель
460 / 77 / 4
Регистрация: 18.06.2010
Сообщений: 514
|
|||||||||||||||||||||||||||
1 | |||||||||||||||||||||||||||
Результат работы над ошибками по поводу глобальных переменных на с++09.01.2017, 08:56. Показов 3214. Ответов 13
Метки нет (Все метки)
Данная статья выйдет в топ. По теме как делать глобальные переменные. Так как имею опыт в написание статей под нужды людей.
Хочу рассказать историю и опыт своих исследований по поводу глобальных переменных Начнем с того, зачем нам нужны глобальные переменные? Для того, чтобы необходимое установленное значение в переменной могло использоваться в разных частях вашего кода! И в разных файлах СПП. Можно ли обойтись без глобальных переменных? Нет! Потому что существуют такие задачи, как установка конфигурационных настроек для работы всего проекта. Например, такие как: Ширина и высота различных окон и панелей. Также установка различных переключателей для изменения стиля поведения работы приложения. Также перевод на другие языки ваше приложение. Где каждая команда на вашем языке будет обозначаться глобальной переменной, в которую будет записано словосочетание команды и потом при переключении языка, в эти переменные будут записываться слова различных языков. Поэтому для больших проектов это нужно предусмотреть на этапе создания проектов. Сейчас расскажу о граблях, на которые наступал при создании глобальных переменных 1. Название маленькой переменной в коде какого-нибудь метода(функции) совпадало с названием глобальной переменной. И это приводило к тому, что глобальные переменные перезаписывались и меняли свое значение. При таком сценарии трудно искать ошибку. Однако есть выход. Мы просто договоримся назвать глобальные переменные с какой-нибудь приставкой. Например, с приставкой GLOB, GLOBperemannaya1… GLOBperemannaya1 и так далее. И Вы уже случайно не сможете добавить в код эту глобальную. 2. В С++ встречались проблемы по поводу #include-ов. Ошибка на которую все поголовно попадаются – это прописать в заголовочном файле (file.h) код присвоение значения переменным. То есть нельзя заниматься инициализацией переменных в заголовочных файлах. Инициализация - это присвоение переменным значение. Но объявлять переменные только через приставку: extern В заголовочном файле (file_name.h) нужно заниматься тем, что объявлять существование функций(методов) и переменных. Но переменные объявлять только через: extern int GLOBperemen1; Объявлять функции нужно для того, чтобы функции(методы) были видны файлам СПП через подключающие заголовки: #include "file_name.h" Повторюсь: Заголовочный файл должен работать только на упрощение кода, чтобы меньше было писанины в файле спп, который выполняет определенную задачу. Поэтому у Вас есть два выбора создания глобальных переменных: Или одноименные переменные или через структурную переменную создавать свои коллекции глобальных переменных. Есть еще способ, как создать глобальную переменную через класс, но он оставляет за собой очень длинное название, подробнее обсуждалось тут: Как лучше сделать глобальную переменную? Глобальные переменные через класс имеют дополнительную процедуру вызова, что теоретически увеличивает количество ступеней до получения и присвоения значения переменной. Что может влияет на скорость работы. Это еще не проверено, на сколько, идут тормоза. Но просто имейте это в виду. Надо бы еще структурную переменную переменную проверить на скорость. Вот собственно код:
0
|
09.01.2017, 08:56 | |
Ответы с готовыми решениями:
13
Работы над ошибками Сохранение глобальных переменных между сеансами работы с книгой Рассмотреть программу, написать имена глобальных переменных, локальных переменных, формальных параметров Получить результат работы функции в виде нескольких переменных |
2082 / 1573 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
||||||
09.01.2017, 11:03 | 3 | |||||
Ну да. Чтобы не хранить в каждом инстансе кучу указателей на настройки.
Добавлено через 30 минут В принципе идейка здравая для С. Для С++ лучше сгруппировать их в структуры а потом сделать один/несколько классов которые имеют эти структурки переменные статическими полями. И с extern парится не надо и инструмент для групповой установки/передачи нестандартных настроек. ну к примеру:
Ну в общем то же самое только с пользованием возможностей плюсов для более компактной записи и более удобного использования.
0
|
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
|
|||||||||||
09.01.2017, 11:28 | 5 | ||||||||||
[quote="Fulcrum_013;9983779"]
Также в C++ можно использовать пространство имен.
0
|
2082 / 1573 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
|
09.01.2017, 11:33 | 6 |
Alex5, По всей видимости имелось в виду что в скопе в котором объявлена одноименна переменная "магическим" образом значение которое ожидалось прочитать из глобальной переменной внезапно оказывалось абсолютно другим.
0
|
2082 / 1573 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
|
09.01.2017, 11:36 | 8 |
Можно. Только все переменные пространства имен одним махом не скопируешь и в функцию одним аргументом не передашь. А как известно по Законам Мэрфи как только появляется некие общие правила (глобальные настройки в данном случае) тут же появляются исключения из оных правил.
0
|
2082 / 1573 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
|
09.01.2017, 11:47 | 10 |
Есть. Но и сам кучу раз наступал на грабли с совпадением имен методов и глобальных функций и совпадением имен полей/свойств и локальных переменных/аргументов метода. И очень долго каждый раз удивлялся почему метод вызывающий по идее одноименную глобальную функцию входит в рекурсию и т.п, и так удивляешься пока имя метода не прочитаешь.
Добавлено через 6 минут Потому как только появляется нечто глобальное что подходит вроде бы всему тут же появляются исключения из правил где какая то мелочь совсем не такая. Т.е. гораздо практичнее обычно получается все глобальные настройки пользовать как дефаултные если не указываются другие.
0
|
Строитель
460 / 77 / 4
Регистрация: 18.06.2010
Сообщений: 514
|
|
09.01.2017, 14:45 [ТС] | 11 |
Позволю себе процетировать.
Данный ответ можно перевести, цетирую: Да можно... Теоретически... Рубить мясо топором... Держа тапор одним пальцем левой руки - одним мезинцем. Балансируя тапор на одном пальце и отклонением направлять в сторону мяса. Пожалейте программиста. Добавив одну модификацию придется много процедур, функций и методов переписывать, если хоть что-то изменится в программе.
0
|
Неэпический
|
|
10.01.2017, 11:30 | 13 |
Наслаждайтесь: Goto - за и против
2
|
10.01.2017, 11:40 | 14 |
0
|
10.01.2017, 11:40 | |
10.01.2017, 11:40 | |
Помогаю со студенческими работами здесь
14
О глобальных переменных Работа над ошибками Работа над ошибками Работа над ошибками Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |