![]() |
Модераторы: LSD |
![]() ![]() ![]() |
|
Proghat |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 50 Регистрация: 16.1.2007 Где: Гомель, Беларусь Репутация: нет Всего: нет |
Как лучше писать и почему?
I вариант:
II вариант:
Внутри rec() n и c не изменяются. Это сообщение отредактировал(а) Proghat - 12.4.2009, 18:29 |
||||
|
|||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
попробуйте написать хотя бы 10 подобных функций с их использованием в обоих вариантах, сравните и сами увидите ответ на Ваши вопросы этой темы. ![]() |
|||
|
||||
Proghat |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 50 Регистрация: 16.1.2007 Где: Гомель, Беларусь Репутация: нет Всего: нет |
Сравнивать по каким критериям? По времени работы, объему кода, занимаемой памяти? Это сообщение отредактировал(а) Proghat - 12.4.2009, 18:33 |
|||
|
||||
NDQuattro |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 91 Регистрация: 18.7.2008 Где: Украина Репутация: нет Всего: нет |
Используйте их только в крайних случаях.
В их использовании таится возможность появления ошибок которые сложно выявить. |
|||
|
||||
Proghat |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 50 Регистрация: 16.1.2007 Где: Гомель, Беларусь Репутация: нет Всего: нет |
Нужда в передачи массива - крайний случай? Добавлено: Указатели! : ). Извиняюсь. Это сообщение отредактировал(а) Proghat - 12.4.2009, 18:50 |
|||
|
||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: -1 Всего: 69 |
передавайте в качестве параметра функции указатель на массив глобальные переменные - зло. |
|||
|
||||
UniBomb |
|
|||
Новичок ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: нет Всего: 97 |
Меня всегда радовали подобные вопросы))) Всё зависит от множества факторов - от конкретной задачи, от конкретной платформы, от конкретных рук. Напри пр программировании микроконтроллеров глобальные переменные намного лучше скажем переменных static как в плане скорости выполнения, так и скорости выполнения.....
|
|||
|
||||
Soah |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 512 Регистрация: 18.2.2009 Репутация: нет Всего: 54 |
||||
|
||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 5 Всего: 92 |
Что-то в этом есть ![]() |
|||
|
||||
UniBomb |
|
|||
Новичок ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: нет Всего: 97 |
Любитель, ммм... имелось в виду "как в размере программы, так и в скорости выполнения"))) Просто как всегда пальцы работают быстрее мозга...
|
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 4 Всего: 154 |
вы очень сильно облегчите себе жизнь, если ваши ф-ии, по возможности, будут реентерабельными, то-есть результат должен зависеть только от параметров и ни от чего больше
|
|||
|
||||
UniBomb |
|
|||
Новичок ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: нет Всего: 97 |
Lazin, очень сложно такое сделать, если функции являются обработчиками прерываний, обработчиками собитий (связанных с приёмом программы сообщений ОСи), главных функций потоков....
|
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: нет Всего: 26 |
UniBomb, +1
везде где есть callback'и без глобальных переменных (в том или ином виде) не обойтись |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 4 Всего: 154 |
про обработчики прерываний я согласен, а с остальным - нет
Очень даже обойтись, с помощью правильного дизайна приложения ![]() К примеру, есть у тебя ф-я обратного вызова, которая вызывается при подключении нового клиента, ну так почему-бы не передать в эту ф-ю указатель(ссылку) на новое соединение, и на объект сервер, в общем, на все что может понадобиться этой ф-ии что-бы сделать свою работу? Если нет ограничений на сигнатуру ф-ии, то можно делать все что угодно, если это какая-либо API ф-я то тут то-же не все потеряно, к примеру ф-я передаваемая в CreateThread должна получать указатель, через этот параметр можно передать все что угодно, GetQueuedCompletionStatus может получать два указателя, которые передаются в ф-ю пользователем и тд.. |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: нет Всего: 196 |
Интересно, а что делать в случае WndProc? Она объявлена как:
Lazin, а фотка симпатичной девушки на аватарке с какой периодичностью меняется?.. |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 8 Всего: 207 |
а я и с обработчиками прерываний не согласен реентерабельной функция может быть и при использовании глобальных данных ![]() -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 4 Всего: 154 |
я думал, что можно передать указатель на свой объект, через последний параметр ф-ии CreateWindow, хотя GDI не мой конек ![]() bsa, со случайной ) Это сообщение отредактировал(а) Lazin - 13.4.2009, 14:00 |
|||
|
||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 5 Всего: 92 |
GetWindowLong/SetWindowLong + GWL_USERDATA + hWnd.
|
|||
|
||||
Ln78 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 274 Регистрация: 25.11.2006 Репутация: нет Всего: 15 |
Proghat, а что это такое вообще? Просто лишь бы что-то было, или есть какой-то смысл именно в этом примере? В обоих вариантах примера используется непонятно где находящееся a[i], смысл if'а в функции остался недоступен, других вариантов останова, кроме как по переполнению стека вызова я что-то не вижу. Что полезное делает это функция понять невозможно. Для данного примера ответ, ИМХО, зависит от того, какая цель преследуется. Если нужно, чтобы переполнение наступило быстрее, то дополнительные переменные этот процесс ускорят. Если нужно, чтобы подольше помучилась, то использование глобальных переменных немного продлит процесс. Что это за пример такой? ![]() |
|||
|
||||
Proghat |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 50 Регистрация: 16.1.2007 Где: Гомель, Беларусь Репутация: нет Всего: нет |
Я привел не полный код. |
|||
|
||||
Ln78 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 274 Регистрация: 25.11.2006 Репутация: нет Всего: 15 |
Так его или совсем не нужно было приводить, получается тема "за жисть поговорить", или как-то конкретизировать условия. Или думаешь, без этого примера никто не догадается чем отличается в коде использование глобальных переменных и передача переменных как параметров фукнции? Если хочешь, чтобы общий разговор на тему был полезен и тебе, можно было как-то хотя бы немного уточнить, на чём программируешь (С, С++), какой сложности программы писал, что на тему читал и т.д. А то ведь не всякий разговор воинов дZена понятен школьнику обыкновенному. Это сообщение отредактировал(а) Ln78 - 13.4.2009, 16:11 |
|||
|
||||
Proghat |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 50 Регистрация: 16.1.2007 Где: Гомель, Беларусь Репутация: нет Всего: нет |
Понятно. Учту ; ). Хотел спросить об использовании глобальных переменных именно в данном примере(это решение простой олимпиадной задачи). Прочитал эту тему и те две темы, которые предлагал Soah и сделал для себя выводы: 1) всегда нужно стараться сделать функцию максимально независимой от другого кода; 2) в решении простой олимпиадной задачи (<100 строк) можно использовать глобальные переменные.
Учу C++. (До этого писал на Pascal около трех лет.) Писал решения олимпиадных задач. Это сообщение отредактировал(а) Proghat - 13.4.2009, 16:32 |
||||
|
|||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 1 Всего: 56 |
Использование глобальных переменных нецелесообразно и опасно. Если дизайн поджимает и обойти никак, тогда лучше использовать функцию со static variable inside. Хотя бы избавит от несогласованности в инициализации между еденицами трансляции. В С++ я вообще не вижу в них смысла, если конечно не приходится в существующий "дизайн" вписываться.
|
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: нет Всего: 26 |
нецелесообразно и опасно в частных случаях когда это действительно нецелесообразно и опасно в общем случае, это и целесообразно, и безопасно
Это сообщение отредактировал(а) GoldFinch - 13.4.2009, 17:45 |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
на Си просто другого (более приемлимого) выхода нет, чтоб реализовать нужную конструкцию, поэтому приходиться идти на жертвы. безопасность достигается путем не контролируемой договоренности о не изменении напрямую "чужих" переменных а целесобразность применения в данном случае характееризуется всего лишь удобством дизайна. Это сообщение отредактировал(а) mes - 13.4.2009, 17:54 |
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 1 Всего: 56 |
есть опыт работы с большими проектами? |
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: нет Всего: 26 |
vinter, с небольшими, и не на С\С++
приведите пример, где использование глобальных переменных нецелесообразно и опасно, ато может то что очевидно вам, совсем не очевидно остальным мне кажется более опасным и нецелесообразным, давать общие советы, о том какие конструкции использовать ни в коем случае нельзя, а какие надо лепить везде где только можно Это сообщение отредактировал(а) GoldFinch - 13.4.2009, 18:09 |
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 1 Всего: 56 |
GoldFinch, конкретного примера под рукой нет. Но, потенциальные проблемы:
1. Проблемы связанные с сокрытием и перекрытием имен. Ужасные проблемы могут быть связаны с этим. 2. Проблемы меж-еденица-трансляционного взаимодействия - нет гарантии, что переменная инициализирована при ее использовании, нет гарантии что переменная не изменит своего значения в неподходящий момент. Глобальную переменную в больших проектах, практически невозможно контролировать |
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 1 Всего: 59 |
Возьмем пример: Некие настройки большого проекта - пара сотен окон, все хотят сохранить некие свои настройки. 1 подход. Сохраняйся кто как может. Используем налево-направо серализацию, плодим кучу веток в реестре или файлах настройки. Это все легко контролируется? 2 подход. Глобальный объект локальных настроек. Один на всех, который поддерживает необходимые методы для сохранения всего что кому-нибудь нужно. Что легче контролировать? У глобальных переменных есть только одна проблема: программист(-ы). Если разработчик(-и) дружат с головой ничего страшного в глобальных переменных нет. ИМХО. |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 4 Всего: 154 |
самый простой пример - масштабируемость кода, допустим есть у нас глобальая переменная connection, мы ее юзаем в множестве мест программы, все хорошо, не нужно передавать лишних параметров в методы(ф-ии), достаточно проверить if (connection.connected()) и все, программа растет и обрастает функционалом, и тут выясняется что дальше нам прийдется работать с большим количеством connection-ов, либо с connection-ом другого типа ![]() |
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 1 Всего: 56 |
почему некий внешний объект должен хранить локальные настройки окна? Это не верно. Есть некие глобальные настройки, их можно сделать через глобально доступный синглтон. Но уж никак не делать глобальную переменную. |
|||
|
||||
GoldFinch |
|
||||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: нет Всего: 26 |
и каково же решение этой проблемы? чем например extern Сonnection_t connection; отличается от class SomeNiceSingleton ... { ... Сonnection_t connection; ... } Добавлено через 1 минуту и 33 секунды
чем глобальный тип (класс) лучше глобальной переменной? |
||||
|
|||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 8 Всего: 207 |
передавать адрес connection в каждую функцию его использующую религия не позволяет? ![]() -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 5 Всего: 92 |
MAKCim, так это будут самые что ни есть неглобальные переменные. Обычный инстан-метод по сути.
|
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 1 Всего: 56 |
1. Нет проблемы имен. 2. Нет проблемы с меж-еденица-трансляционным взаимодействием. 3. При небольшой модификации нет проблем с межпроцессным взаимодействием |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 4 Всего: 154 |
такое в С++ еще можно передавать в кач. параметра конструктора и хранить ссылку(указатель, копию) в экземрляре объекта
возможностью управлять временем жизни синглтона, в отличии от глобальной переменной позволяет, если что, это был антипример ![]() |
|||
|
||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: -1 Всего: 69 |
Пару фраз вырвал из книги. Полный текст статьи занимает 2-3 страницы.
С.Х.Дьюхерст. Скользкие места С++.
|
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 1 Всего: 59 |
А чем синглтон принципиально отличается от глобальной переменной? Под глобальной переменной я, например, понимаю не только обычную переменную типа int GlobalIntA, но и объект какого-либо класса, доступный из любого модуля проекта. Какая разница? Доступ через интерфейсные функции? Так и к обычной глобальной переменной можно через интерфейс доступ организовать. Вопрос не в том как это назвать и во что обернуть. Важно то, что существует некий объект (один на проект), состояние которого можно изменить из многих мест в проекте. Т.е. глобальный объект. И какая религия мешает использовать такие объекты (переменные) лично я не понимаю. Зачем вертеться ужом на сковородке только из-за того, что кто-то сказал, что глобальные переменные использовать не надо. Это мое ИМХО, естественно, я достаточно часто использую глобальные переменные когда они мне удобнее и никаких неудобств пока не ощутил. Правда, если бы я сделал глобальной переменную int i - я думаю ощутил бы некоторые неудобства, но для этого на плечах должно быть не только устройство для приема пищи и просмотра телевизора. ИМХО. |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 4 Всего: 154 |
синглтон - это когда объект некоторого типа, один на все приложение, и другой такой-же создать нельзя, это не то-же самое что и глобальная переменная ![]() |
|||
|
||||
Cтpaнник |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 53 Регистрация: 12.10.2008 Где: Россия, Санкт-Пет ербург Репутация: нет Всего: нет |
||||
|
||||
Rififi |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1254 Регистрация: 9.3.2008 Репутация: нет Всего: 36 |
Proghat,
Как лучше писать первым способом и почему? чтобы не прослыть ламером :eek: :gigi: |
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 1 Всего: 59 |
Что такое LOC? У меня варианты: Чистящие средства: http://www.amway.ru/catalog?category=1094 Влажные салфетки: http://aukro.bigmir.net/item589863303-loc-...e-salfetki.html Библиотека конгресса США: http://www.loc.gov/index.html Да не подумайте, что я распространяю СПАМ. Про аббревиатуры уже был разговор. Я не знаю, что такое LOC. Вы имеете в виду кол-во строк? Модулей? Отвечаю: Размер проекта в LOC-ах примерно по 50К на ШКРАБа ![]() |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 4 Всего: 154 |
Lines Of Code
|
|||
|
||||
Fazil6 |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: нет Всего: 60 |
тем, что поддерживать нужно только интерфейс. Используя глобальную переменую мы связываем между собой код, который ею пользуется. Сопровождать придется либо внутри " глобального типа" (что проще) либо по всему коду, где глобальная переменная используется
советую читать много раз цитату, которую привел zim22, может быть придет осознание. Главная суть проблемы глобальных переменных совсем не в том, что состояние меняется из разных мест... Глобальные переменные также удобны как удобно нарушение инкапсуляции в классах.
согласен. И совсем не нужно для этого вертеться ужом. |
||||
|
|||||
Anikmar |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 1 Всего: 59 |
Ну? Глобальная переменная некого типа тоже одна на все приложение и вторую такую-же создать нельзя. Ведь переменная типа "Класс_сингл_тон" одна? - Да. Она глобальная? - Да. В чем ее принципиальная разница от переменной не класса "Класс_сингл_тон"?
Что значит сопровождать внутри кода? А если поменяем интерфейс - его не надо будет сопровождать внутри кода? Чем отличается сопровождение вызовов интерфейса? К глобальной переменной можно также сделать функции доступа по типу интерфейса. Просто если разделять два понятия как разные - тогда все понятно, но лично для меня они принципиально одинаковые:
Мда. Я это подозревал, но не думал, что так просто. Думал - некая величина, оценивающая объем проекта ![]() Строк кода - не знаю сколько (хотел посчитать, но что-то простого инструмента не смог найти, чтобы сразу в каталоге и во всех вложенных посчитать кол-во строк CPP и H). Проект небольшой, сразу скажу. По поводу кол-ва человек - этот проект чисто мой (пока). Сейчас просто я немного другими делами занимаюсь. Если подскажете простой способ (без написания программки подсчета - лень) я скажу сколько строк сейчас проект. Одно время работал в команде, где было человек 15 и проекты были намного солиднее. И глобальные переменные использовали, и никто не путался, и проблем не было. Видимо потому, что начальство было отличное и ТЗ проработанные и взаимодействие отлажено. |
||||||
|
|||||||
Lazin |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 4 Всего: 154 |
глобальная переменная
синглтон
чувствуешь разницу? время жизни глобальной переменной не определено, можно созданть множество объектов и тд.. синглтон это вообще совершенно другое, это не замена глобальных переменных, если у нас что-то в программе должно-быть доступно в разных еденицах трансляции это не синглтон, синглтон, это когда объект некоторого типа может быть создан только в одном экземпляре, например лог-файл, или файл конфигурации... |
||||||
|
|||||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 1 Всего: 59 |
Опять-таки скажу, что особой разности не вижу. Объект синглтона естественно один, но никто не мешает натыкать разных классов-синглтонов, как и не мешает натыкать глобальных переменных. Так что остаюсь при своем мнении - главное не как обозвать глобальный объект и во что его обернуть, а как его организовать и как с ним работать. Суть глобального объекта и объекта синглтона одинакова. Последний, согласен, более защищен от неправильных действий, но все равно сам объект остается глобальным, а то что скрыт за вызовом метода - также можно скрыть и обычный объект, если не объявлять его extern, а доступаться через некий глобальный интерфейс. К тому же предел паранойи должен быть - я понимаю защиту от дураков-пользователей, но защиту от дураков- программистов собственной команды нужно организовывать методом увольнения оных. ИМХО. У меня глобальный объект настройки вынесен в отдельный модуль, который линкуется к каждому проекту в виде библиотеки. Из проекта требуется вызвать метод Init для его инициализации, а дальше через интерфейсные методы получать/сохранять необходимую информацию. Я пока не увидел никаких особых проблем - если объект хорошо документирован и есть инструкция, то никакой опасности нет. Ну а с дури и болт сломать можно. ИМХО. |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 4 Всего: 154 |
а синглтон разве обязан быть глобальным?
конечно любой глобальный объект это гвоздь в гроб масштабируемости кода, и множество разных синглтонов используемых глобально в проекте это плохо, но еще хуже использование глобальных переменных, так как в примере ТС-а
если этот глобальный объект хранит конфигурацию приложения, то это нормально, так как конфигурация приложения редко меняется |
|||
|
||||
GoldFinch |
|
||||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: нет Всего: 26 |
если говорить о примере ТСа, то там применение глобальных переменных совершенно оправдано, т.к. прога маленькая кроме того оно неплохо преобразуется в такой код:
Это сообщение отредактировал(а) GoldFinch - 14.4.2009, 08:37 |
||||
|
|||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 8 Всего: 207 |
нет, переменная как была глобальной, так и останется вообще в таких случаях прямое обращение к глобальной переменной заменяется на вызов API получения ее адреса, который в случае чего легко меняется -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
Remiznik |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 379 Регистрация: 30.4.2005 Репутация: нет Всего: 1 |
сразу скажу что больших проетков не писал, но мнение по этому поводу есть !
Для меня какждая функция должна быть универсальной, то есть может как можно чаше использоваться и даже быть пересена в другой проект так как это очень удобно написал одну функцию и юзаешь( конечно это почти не возможно но нужно стремиться ) . А при использованиии глобальных переменых это невозможно. И потом наверно я не слишком умён чтоб отследить все изменения глобальной переменной в процессе работы программы ведь если есть даже пара функций с изменением глоб.пер. и они часто используетться не так просто это сделать ! |
|||
|
||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: -1 Всего: 69 |
||||
|
||||
Remiznik |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 379 Регистрация: 30.4.2005 Репутация: нет Всего: 1 |
а что STL ? я использую STL но причом тут глоб.перемен ?
|
|||
|
||||
Anikmar |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 1 Всего: 59 |
Я с начала спора говорил - все от конкретики зависит и полностью отказываться от глобальных переменных себе же дороже. Если каждая функция будет использовать глобальные переменные для своей внутренней работы - в топку такой код.
Для интереса написал программулинку, которая посчитала сколько строк у меня сейчас в рабочем проекте. Получилось 96000 с пустыми строками и 84000 без учета оных. Как я и говорил не сильно большой проект, тем не менее и в крупных проектах использовали глобальные объекты без всякого вреда для проекта и психики команды. |
||||
|
|||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: -1 Всего: 69 |
в том то и дело, что функции STL не нуждаются в глобальных переменных. |
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: нет Всего: 26 |
zim22, и много их там, функций STL? 20?
|
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 1 Всего: 56 |
||||
|
||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: -1 Всего: 69 |
||||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 1 Всего: 56 |
zim22, ~100
|
|||
|
||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: -1 Всего: 69 |
нет. извольте, но я настою на своём. Страуструп. Язык программирования С++. Специальное издание. Глава 18.
|
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: нет Всего: 26 |
cin, cout, cerr - глобальные переменные?
|
|||
|
||||
mes |
|
||||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
тут та же история что и с дефайном. Когда говорят , что он зло, имеется ввиду не сама директива #define, а ее применение не по назначению (для реализации функций или определения констант) так и тут, никто(я надеюсь ;)) не говорит, что сама по себе глобальная переменная -зло, (просто есть некоторые нюансы использования), а способ программирования, при котором то, что можно было сделать локальным выставляется на всеобщее обозрение.
тоже но с меньшим уроном проявляется и в циклах
да иногда необходимо именно такое поведение, но присутствие такого фрагмента, заставляет напрячься. так же и с глобальными переменными. часто говорят, зачем напрягаться, бросил переменную где попало и все ок. К сожалению это только видимое облегчение.. Вместо того чтоб один раз не поленится и убрать лишние зависимости, Вы обрекаете свои мозги постоянно контролировать зависимости, вместо плодотворной работы над следующим этапом. Все вышесказанное имхо, проверенное на горьком опыте ![]() Это сообщение отредактировал(а) mes - 14.4.2009, 20:16 |
||||||
|
|||||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 4 Всего: 154 |
да, но тебя как правило не заботит то, что туда записывали раньше, так-что не в счет ![]() |
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 1 Всего: 56 |
Передо мной лежит книга, где среди авторов есть Meng Lee и Alexander Stepanov и вот там перечислено около 100 ф-ий. Эти ребята в STL по авторитетней будут ;) Страуструп не прав полностью, в algorithm 66 ф-ий(если я не обсчитался). Но в STL есть не только algorithm |
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: нет Всего: 26 |
||||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
повторюсь : не сама глобальная переменная - зло, а или не к месту. и типа правило: если можно не делать переменную глобальной, лучше не делать. ![]() Это сообщение отредактировал(а) mes - 14.4.2009, 23:10 |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 4 Всего: 154 |
это другой случай нам не важно, что раньше было записано в лог-файл или вывдено в терминал(если мы не пытаемся эмулировать GUI в терминале) поэтому, такие вещи как стандартные потоки ввода-вывода не создают проблемм(хотя они все-же имеют состояние и это иногда создает проблемы) |
|||
|
||||
J0ker |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: нет Всего: 14 |
а кто вам сказал, что это переменные? вы им попробуйте что-нить присвоить хыхыхы ![]() |
|||
|
||||
Dmi3ev |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1698 Регистрация: 28.11.2007 Репутация: нет Всего: 41 |
![]() опять тема, которая заставляет форумчан философствовать и спорить... Мое мнение совпадает с мнением mes-а в предыдущем посте, считаю, что другого быть не может, хотя может, но мне кажется, что оно неверно, + к этому постоянно в книгах встречается это (причем с примером, почему лучше, и примеры бывают разные, самый распространенный, по-моему, это то, что можно работать с локальной, думая, что работаешь с глобальной, и получать неразбериху). Я воспринимаю это, как правило... Может я и не прав, так считаю я, и спорить не хочу... ![]() -------------------- |
|||
|
||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 5 Всего: 92 |
||||
|
||||
azesmcar |
|
||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 2 Всего: 211 |
Это переменные
из стандарта С++. И то что им нельзя ничего присвоить еще не значит что они константны ![]() оператор присваивания это только один из способов изменить обьект.
![]() |
||||||
|
|||||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 1 Всего: 59 |
Вот так рождаются баяны. И все из-за того, что кто-то взял на себя ответственность высказать абсалютное мнение.
Глобальные переменные - ЗЛО Дефайн - ЗЛО goto - ЗЛО Все в этом мире может быть ядом, а может быть лекарством. Все зависит от дозы. Ничего злого в глобальных переменных нет. Зло только в способе их применения. |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 2 Всего: 211 |
Anikmar
да, тему надо перенести в религиозные войны ![]() |
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 1 Всего: 59 |
||||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 4 Всего: 154 |
||||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 1 Всего: 59 |
Если использовать термин "зависят" - вы правы. А если использовать термин "взаимодействуют" - то глобальные переменные способствуют этому. Нужно найти золотую серединку, а не ходить по краю. |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
Скорей всего из за того, что кто услышав эти выражения принял за абсолют. Например выражение : змеиный яд - смертелен для человека. ( Однако он присутсвует в большом ряде лекарств. ) Также как : витамины - приносят пользу. ( Однако принятие большого кол-ва ведет к отравлению. ) Они не абсолютны, но зачастую использование пояснения опускается, потому что оно известно обоим сторонам или в данном рассмотрении не столь важно. Радиация - зло. Однако сколько ее применений во благо! Но от этого оно не перестает быть злом. ![]() |
|||
|
||||
Rickert |
|
|||
![]() Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: нет Всего: 52 |
Третья тема однако, чем всё закончилось?
![]() -------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 1 Всего: 59 |
||||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
знаете, понятие "зло" в обычной жизни используется для обучения ребенка. Ток - зло. В розетку нельзя совать руки. Спички -зло. Можно поджечь или обжечься. Взрослый (нормальный) человек понимает что и как надо использовать в принципе не нуждается в образах. Ему в голову не придет засунуть руку в кипяток, и использует его чтоб заварить чай. Хотя скелет нарисованный на трансформаторах высокого напряжение с надписью "не входить" предназначен и для взрослых. Однако элекрик входит и производит нужные работы. Т.е. любое выражение надо воспринимать в контексте его высказывания и учитывать, что (практически) всегда есть недоговоренность, которую по каким то причинам сейчас не важна. ![]() Добавлено через 2 минуты и 40 секунд ![]() Хорошие на свой взгляд определили, кто плохие. Начали против них войну. И победив установили мир. На то они и хорошие. ![]() |
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 1 Всего: 59 |
||||
|
||||
J0ker |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: нет Всего: 14 |
||||
|
||||
Rickert |
|
|||
![]() Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: нет Всего: 52 |
J0ker, define зло?
Всё, это последняя остановка, народ. Скоро половину языка назовут злом. Ну и не используй ![]() Это как господь дал тебе руки и ноги, а ты сказал, что их слишком много и половины себя лишил. Зачем - сам не понял. -------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 4 Всего: 154 |
Rickert,
![]() |
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 1 Всего: 56 |
||||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 8 Всего: 207 |
дефайн не зло в принципе, поскольку с помощью него можно определять не только константы
готу не зло в С глобальные переменные не зло в принципе _основная_ цель программирования - получить программу, выполняющую нужные функции, эффективность и пр - это уже второй и пр. вопросы вы уверены, что глобальные переменные во всех случаях этому не способствуют? -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 2 Всего: 211 |
какой злой код.
![]() на тему гото дискуссия была уже |
||||
|
|||||
Lazin |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 4 Всего: 154 |
и не лень? ![]()
Добавлено через 2 минуты и 33 секунды
Это сообщение отредактировал(а) Lazin - 16.4.2009, 08:59 |
||||||
|
|||||||
azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 2 Всего: 211 |
кому? ![]()
ничего злее не видел..срочно удалить ![]() Это сообщение отредактировал(а) azesmcar - 16.4.2009, 09:02 |
||||
|
|||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 1 Всего: 56 |
ага, с его помощью еще определяются убогие куски кода, которые нельзя трассировать в дебаге. Отличный функционал ![]()
глобальные переменные источник потенциальных ошибок. И лучше взять за правило их не использовать. Кроме того, ГП прививают ненужные зависимости программам. Кстати это я все о С++, на С не писал, не знаю как там дела обстоят. зачем городить такой убогий код? typedef'ы нынче не в моде? |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 4 Всего: 154 |
ну, данный код создает 39 специализаций шаблона, вида:
предлагаешь ручками написать ![]() upd. если что, я это не писал, а из одного своего проекта скопипастил и немного изменил ![]() Это сообщение отредактировал(а) Lazin - 16.4.2009, 09:11 |
|||
|
||||
azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 2 Всего: 211 |
Андрей Александреску когда писал библиотеку Loki видимо не успел изучить typedef. И я тоже видимо не очень хорошо его представляю..не покажете как заменить? Добавлено через 1 минуту
да шучу я ![]() |
||||
|
|||||
Rickert |
|
|||
![]() Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: нет Всего: 52 |
Приводить аргументы типа #define size(x) rand() - глупо. Ну и что это такое? Ну define, ну западло и чего дальше-то? Кому это надо такое делать? Уходящему программисту, которому недовыплатили пособие? Так он и без того нагадит
![]() -------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 1 Всего: 56 |
с произвольными типами никак, а вот с конкретными легко.
Это сообщение отредактировал(а) vinter - 16.4.2009, 09:18 |
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: нет Всего: 26 |
||||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 2 Всего: 211 |
Так я тоже об этом. Это библиотека, а вот пользователь библиотеки может сделать typedef на конкретные типы и забыть о макросах. Я только хотел заметить что не все так однозначно. Макросы используются в СТЛ, в БУСТ, в ЛОКИ и во многих других библиотеках написанных серьезными людьми, которые кстати сами советуют избегать макросов. Но это не всегда удается. |
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 1 Всего: 56 |
не, спасибо, мне в студии удобно и хорошо. Из за макросов менять не собираюсь, я лучше их использовать не буду. |
|||
|
||||
MAKCim |
|
||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 8 Всего: 207 |
inline не всегда inline ![]() мысли шире
и вариации потенциальные ошибки есть всегда лучше взять за правило думать прежде чем использовать static/анонимный namespace отменили? весь linux построен по принципу модуль = *.c файл : {static ГП, static функции, глобальные функции, экспортируемые функции} -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||
|
|||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 5 Всего: 92 |
MAKCim, C есть С - там свои особенности
![]() |
|||
|
||||
azesmcar |
|
||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 2 Всего: 211 |
Любитель
Ну, макросы необходимы и в С и в С++. Есть по крайней мере 3 (сейчас больше не припоминаю) вещи которые невозможно написать без макросов. 1.
2.
3.
навскидку пока эти 3 Добавлено через 59 секунд в остальном макросы могут облегчить написание кода, т.е. генерировать то, что надо писать вручную. А тут уже программисту решать, надо или не надо. Зависит от ситуации. |
||||||
|
|||||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 1 Всего: 56 |
azesmcar, я про макросы говорил, а не препроцессор. Препроцессор, бесспорно, вещь нужная.
и все же, в большинстве случаев можно утверждать, что будет inline на конкретном компиляторе. Лично мне, этого достаточно. это не глобальные переменные, они глобальны в рамках юнита, а не проекта, разговор не о них(хотя эти тоже лишнее).
linux не показатель. Его основа писалась очень давно, времена меняются. Принципы программирования тоже. |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 2 Всего: 211 |
Так ведь ASSERT - макрос..и TYPELIST тоже. Речь не о том что надо макросы писать - хорошо и безусловно перед тем как написать макрос стоит хорошенько подумать над другими возможными решениями. Я просто хочу сказать что не стоит так однозначно ставить крест на макросах, иногда без них не обойтись (говоря не обойтись я не имею ввиду что по другому невозможно написать, я имею ввиду что просто другой способ - хуже). |
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 1 Всего: 56 |
azesmcar, ассерт можно на ф-ию заменить, с typelist сложнее, то тоже, я думаю, можно выкрутиться
|
|||
|
||||
azesmcar |
|
||||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 2 Всего: 211 |
можно, но тогда надо будет вручную передавать функции все параметры и получится вместо
я уже не говорю о том что #CONDITION в функцию без макросов не передать. Т.е. чтобы асерт выдавал текст проверки. (типа: assertion failed when checking condition "ptr != 0" in file program.cpp, on line 666, in function myfirstprogram::myfirstfunction) хотя как я уже написал
Это сообщение отредактировал(а) azesmcar - 16.4.2009, 13:47 |
||||||||
|
|||||||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 4 Всего: 154 |
за сколько часов напишешь без макросов мой пример с предыдущей страницы? ![]() |
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 1 Всего: 56 |
Lazin, пока у меня нет необходимости, не будет и ответа.
|
|||
|
||||
J0ker |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: нет Всего: 14 |
1. #pragma once давно уже пора добавить в стандарт:
src/include/blahblahblah.h src/include/blah/blahblahblah.h #include "blahblahblah.h" #include "blah/blahblahblah.h" 2. #define NUM_OF_DUMMIES 32 - зло 3. #define NUM_OF_DUMMIES 32 ....... #undef NUM_OF_DUMMIES добро |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 2 Всего: 211 |
И разделил J0ker добро от зла..и воцарился на земле мир и покой, и перестали программисты писать макросы ибо это не кашерно
![]() Откровение от Страуструпа, глава 18, стих 20 Это сообщение отредактировал(а) azesmcar - 16.4.2009, 16:48 |
|||
|
||||
Rickert |
|
|||
![]() Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: нет Всего: 52 |
Объясните мне хоть кто-нибудь: что автор хотел этим сказать? -------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 4 Всего: 154 |
в данном примере, макроопределение NUM_OF_DUMMIES, действует на небольшую часть исходного кода, только там, где оно нужно |
|||
|
||||
Rickert |
|
|||
![]() Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: нет Всего: 52 |
Вот я и спрашиваю: что автор хотел сказать? -------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 5 Всего: 92 |
То, что он разрешает использовать макросы, если они не вырываются за пределы файла
![]() |
|||
|
||||
nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: 13 Всего: 43 |
Не нужны совсем.
В Java/.NET же без них обошлись и кучу гигабайтов успешного кода написали ) |
|||
|
||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 5 Всего: 92 |
Ээ.. Классы тоже не нужны - в С же их нет и без них кучу гигабайтов успешного кода написали ;)
Извини, но это не аргумент ![]() |
|||
|
||||
Амортизатор2 |
|
||||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 6.2.2006 Репутация: 0 Всего: 2 |
Глобальные переменные при бесконтрольном их использовании повышают связность кода, уменьшают гибкость и масштабируемость. Вот это плохой пример их использования:
Вот тот же пример, сделанный как положено:
Функция foo() - в первом примере грязная, использует деструктивное присваивание переменной a, во втором случае - она чистая, и присваивание делается вне ее, в отдельном грязном коде. |
||||
|
|||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: нет Всего: 33 |
Не знаю о какой версии идет речь, но я использую 0.1.17. В ней макросов почти нет. Очень даже удобная вещь. Учитывая что была написана как пример к книге. Даже в некоторых проектах ее встречал. -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
500mhz |
|
||||
![]() шайтан ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1017 Регистрация: 5.5.2008 Где: Киев / Italy Репутация: нет Всего: 14 |
Амортизатор2
мистер ну и к чему ваш пример? отдизасмите и найдите 8 отличий ))) вариант 1 будет примерно так
вариант 2 будет примерно так
-------------------- |
||||
|
|||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 5 Всего: 92 |
500mhz, а к чему ваш пример?
![]() |
|||
|
||||
17dufa |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 324 Регистрация: 2.3.2006 Репутация: нет Всего: 5 |
не используйте. никогда и нигде.
![]() |
|||
|
||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 5 Всего: 92 |
17dufa, прочитайте недавнюю тему про синглтоны
![]() |
|||
|
||||
nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: 13 Всего: 43 |
А Registry?)
|
|||
|
||||
500mhz |
|
|||
![]() шайтан ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1017 Регистрация: 5.5.2008 Где: Киев / Italy Репутация: нет Всего: 14 |
Любитель
ну во первых то что я привел в качестве примера явно не бинарный код во вторых как будут инициализированы всякие там переменные зависит от компилера и его настроек можно преспокойно зарезервировать место в стеке либо просто тупо в памяти и даже в другом сегменте файла в третьих тема не имеет смысла так как с точки зрения проца , ему фиолетово что глобальные что локальные, на быстродействии не скажеться в четвертых с точки зрения безопасности глобальные безопасней, так как по дефолту они не в стеке, а локальные резервируються (по дефолту) в стеке, так что всегда есть шанс ченить переполнить или запороть пс nerezus шалом бро ) куда пропал? Это сообщение отредактировал(а) 500mhz - 26.8.2009, 20:28 -------------------- |
|||
|
||||
nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: 13 Всего: 43 |
500mhz, рутина( хата( жена(
Хотя кому как тебе не знать ) Сейчас работаю с PE-файлом на PHP ) Скоро на хабре статья будет ;) И почему все такие заказы я собираю ((( |
|||
|
||||
Любитель |
|
||||||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 5 Всего: 92 |
Вот и я о том же! И именовать переменные лучше a, b, c, etc. Т. к. во-первых, место на диске (для исходника и объектника) экономим, а к ак следствие - ОЗУ. А итог один...
Но и ещё более явно не исходный. Ассемблерный листинг - это мнемоническое отображение бинарника (игнорируем ассемблерные дефайны, макросы, имена и пр. - не о них то речь!).
Ну да... Вы писали большие проекты? Безопаснее? Да-да... А, если серьёзно, тема о другом. Никак не о low-level. ![]() |
||||||
|
|||||||
500mhz |
|
|||
![]() шайтан ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1017 Регистрация: 5.5.2008 Где: Киев / Italy Репутация: нет Всего: 14 |
Любитель
для качественного кодинга думаю необходимо понимать как работает компилер и что он выдает на выходе, а потом уже спорить о переменных.
однозначно в мемориз ))))) -------------------- |
|||
|
||||
nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: 13 Всего: 43 |
500mhz, не согласен.
Какая разница, где находится переменная, если спецификация отвечает на вопрос "что произойдет"? Да никакой. Гораздо важнее, чтобы код был читаемый. Никому не нужен код, который работает в 5 раз быстрее и занимает 40 строчек вместо 100, если в нем никто не разбирается кроме автора, который может в любой момент покинуть проект. Главные факторы - время разрабюотки и поддерживаемость. |
|||
|
||||
500mhz |
|
|||
![]() шайтан ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1017 Регистрация: 5.5.2008 Где: Киев / Italy Репутация: нет Всего: 14 |
nerezus
ну так и я про то что фиолетово какая переменная локальная или глобальная главное чтоб удобно было пс но глобальные "надежней" ))) вот представь есть у тебя функция в ней локальные переменные, и тут ты вызываеш ну к примеру функцию из внешней dll , а dll ну чуть чуть глюковатая (всякое бывает) и портит стек, кусочек стека где лежат твои переменные (у нас же одно с ней адресное пространство значит и стек один), возвращаеться твой вызов в твою функцию и бабац результат работы совсем не тот что ожидали. -------------------- |
|||
|
||||
Lazin |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 4 Всего: 154 |
![]()
![]()
lol ![]() а если будут только глобальные переменные, то типа все ОК, да? ![]() а как ты напишешь программу, которая будет использовать только глобальные переменные и не будет вызывать ф-ии, если не секрет? Добавлено @ 20:07 гы гы Это сообщение отредактировал(а) Lazin - 27.8.2009, 22:15 |
||||||||
|
|||||||||
500mhz |
|
|||
![]() шайтан ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1017 Регистрация: 5.5.2008 Где: Киев / Italy Репутация: нет Всего: 14 |
Lazin
ты с темы не соскакивай ))
и не путай параметры передаваемые в функцию и переменные , а то как то непрофессионально получаеться у тебя )))) Это сообщение отредактировал(а) 500mhz - 27.8.2009, 21:33 -------------------- |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 4 Всего: 154 |
а ты вопросы не игнорируй ![]() как, весь этот пропитанный невиданным профессионализмом и глубоким пониманием процесса порчи стека пост, доказывает, что глобальные переменные надежней? ![]() видимо часто доводилось портить... ![]() ...интересно, на меня так подействовало то, что я посмотрел 2 серии Хауса подряд, или я все время так делаю? lol |
|||
|
||||
500mhz |
|
|||
![]() шайтан ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1017 Регистрация: 5.5.2008 Где: Киев / Italy Репутация: нет Всего: 14 |
Lazin
Ты мой герой и мой кумир )))) мое скромное имхо что глобальные надежней при дефолтовых настройках компилера но никто не мешает поставить галочку и передавать все не через стек а через регистры ) -------------------- |
|||
|
||||
W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 2 Всего: 121 |
500mhz, я думал ты мебель продаёшь.
![]() -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
500mhz |
|
|||
![]() шайтан ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1017 Регистрация: 5.5.2008 Где: Киев / Italy Репутация: нет Всего: 14 |
W4FhLF
а что тута весь ВХ теперь тусит? )))) да занят был как бы личной жистью, и вот щас появилось время )))) пс в тему полюбому mov eax,1 , быстрее и безрпаснее чем mov eax, [ebp-4] ))) -------------------- |
|||
|
||||
nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: 13 Всего: 43 |
500mhz, полюбому a = 1 быстрее(для программиста) и безопаснее ;)
По поводу ВХ, то не пречислял себя к нему никогда. |
|||
|
||||
500mhz |
|
|||
![]() шайтан ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1017 Регистрация: 5.5.2008 Где: Киев / Italy Репутация: нет Всего: 14 |
nerezus
мы тут не про асм vs C ))) естественно а=1 проще для понимания чем mov eax,1 вопрос в том как а=1 интерпритируеться потом -------------------- |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 4 Всего: 154 |
а оно может интерпретироваться как угодно, в том числе и как expression, а не как statement, и означать оно может вовсе не изменение состояния некоторого участка памяти ![]() Добавлено через 46 секунд ох уж эти asm-онавты... ![]() |
|||
|
||||
nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: 13 Всего: 43 |
А вот у тебя будет куча вопросов по переносимости не только между платформами, но и ОС. Не говоря уже о поддержке. Если бы мне нужна была 100% прибавка производительности(допустим 100%, хотя в реале эти цифры гораздо меньше и зачастую отрицательные), то я бы рядом поставил вторую железку. Это дешевле, быстрее, проще и удобнее. |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 8 Всего: 207 |
глобальные переменные за _редким_ исключением типа errno (хотя errno на самом деле макрос - вызывающий фкнкцию ;)) должны быть static (С) или в анонимном namespace (C++)
тогда ничего плохого в их использовании нет -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
gcc |
|
|||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: нет Всего: 17 |
assessor'ы класса как глобальные переменные можно использовать...
|
|||
|
||||
![]() ![]() ![]() |
Правила ведения Религиозных войн | |
|
1. Уважайте собеседника 2. Собеседник != враг 3. Старайтесь воздерживаться от тем вида "Windows Rulez" или "Linux Rulez" С уважением, Smartov. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Религиозные войны | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |