Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
...
Тестирование этого примера:
...
Я тоже думаю, что сообщения совершенно бесполезные. Я не проф программист, но меня такая ерунда в мкл напрягает. Интересно, если ссылки на a и b будут константными, PVS Studio выдаст предупреждение (нет возможности проверить самому)?
Все же не плохо вначале разобраться в сути предупреждения, а потом приводить в качестве аргумента. PVS Studio ругается не из-за скрытия глобальной переменной, а из-за того, что a и b переданы по неконстантной ссылке, но не модифицируются. В таком случае, по их мнению, a и b должны быть переданы по константной сслке. Например, следующие примеры не вызывают у этого анализатора претензий:
Я отлично знаю на что ругается PVS.
Еще раз повторю - у нас нет груза ответственности за компиляцию миллиардов строк старого C/C++ кода. Этим приходится заниматься их собственным компиляторам, стараясь не испортить себе бизнес выдачей предупреждений. У нас же ответственность за безопасность и контроль ошибок нашего прикладного языка, работающего с деньгами.
Дай бог несколько процентов авторов MQL4/5 кода являются профессиональными(в настоящем понимании) программистами. Все остальные лишь самоучки и даже понятия не имеют, насколько плохо пишут код.
Например, после перехода на обновленный MQL4, нам пришлось вручную перепахать тысячи исходников в кодобазе и исправить неимоверное количество ошибок в их старом коде. Очень много ошибок было найдено и показано компилятором даже без запуска программ.
Поэтому надо не предъявлять претензии о выдаче предупреждений, а исправлять свой код.
Я отлично знаю на что ругается PVS.
Еще раз повторю - у нас нет груза ответственности за компиляцию миллиардов строк старого C/C++ кода. Этим приходится заниматься их собственным компиляторам, стараясь не испортить себе бизнес выдачей предупреждений. У нас же ответственность за безопасность и контроль ошибок нашего прикладного языка, работающего с деньгами.
Дай бог несколько процентов авторов MQL4/5 кода являются профессиональными(в настоящем понимании) программистами. Все остальные лишь самоучки и даже понятия не имеют, насколько плохо пишут код.
Например, после перехода на обновленный MQL4, нам пришлось вручную перепахать тысячи исходников в кодобазе и исправить неимоверное количество ошибок в их старом коде. Очень много ошибок было найдено и показано компилятором даже без запуска программ.
Поэтому надо не предъявлять претензии о выдаче предупреждений, а исправлять свой код.
Если массив позволяется промахиваться мимо его диапазона, было бы очень глупо при написании индикатора прикладывать усилия соизмеримые с написанием самого индикатора, но только для высчитывания начала вычисления.
Можно было бы не перекапывать этот код, половина не исправлена, а поломана. Можно было просто сделать дополнительное свойство, чтобы различать старый mql4, новый или новый со strict. Какой размер занимает старый компилятор? Незнаю, но наверно меньше мегабайта, никаких проблем таскать его с собой в эпоху гигабайтов. Но вот такой вот типа геройский труд выполнен - по уничтожению codebase.
* * *
Предупреждение
declaration of 'a' hides global declaration at line X
Это идиотское предупреждение. Если у кого-то там из "высшего" мира проблемы с этим, это не значит что у других могут быть такие проблемы. Есть область видимости переменных, кому как называть переменные - это личное дело.
Если массив позволяется промахиваться мимо его диапазона, было бы очень глупо при написании индикатора прикладывать усилия соизмеримые с написанием самого индикатора, но только для высчитывания начала вычисления.
Можно было бы не перекапывать этот код, половина не исправлена, а поломана. Можно было просто сделать дополнительное свойство, чтобы различать старый mql4, новый или новый со strict. Какой размер занимает старый компилятор? Незнаю, но наверно меньше мегабайта, никаких проблем таскать его с собой в эпоху гигабайтов. Но вот такой вот типа геройский труд выполнен - по уничтожению codebase.
Именно исправлена, а не поломана.
Если после правок проскочила ошибка, то это вполне возможно - любое редактирование неминуемо приводит к таким ошибкам. Но это не означает, что на флаг можно вешать единичные ошибки и лезть на гору исправленных.
declaration of 'a' hides global declaration at line X
Это идиотское предупреждение. Если у кого-то там из "высшего" мира проблемы с этим, это не значит что у других могут быть такие проблемы. Есть область видимости переменных, кому как называть переменные - это личное дело.
Потенциальная ошибка на то и потенциальная, что это - совсем не обязательно ошибка.
Ну хз хз. У нас раньше правило было на релиз выставлять 4 или 5 уровень варнингов и галочку считать варнинги ошибками.
От действительно тупых варнингов избавлялись прагмами, но все равно избавлялись
Данная ремарка бессмысленна и никакой полезной информации программисту не несет в принципе, так как никакого сокрытия переменной "а" тут нет изначально, как утверждается.
Если программист сознательно использует сокрытие, то - да, данная ремарка бессмысленна и не несёт полезной информации. Если же сокрытие произошло случайно, по невнимательности, то данная ремарка позволяет обнаружить ошибку на ранней стадии.
Сокрытие возникает лишь когда создается локальная копия переменной, что тоже совершенно законное действие. Даже если возникнет вдруг из-за этого сокрытия ошибка в коде, то она легко находится именно потому что поиск сразу находит одинаковые имена. Если же начать менять и коверкать имена в шаблоне функции, а именно это является "решением" данной ремарки по логике компилятора, то ситуация с поиском ошибок станет гораздо сложней да и путаницы прибавится немеряно в понимании кода. Вроде же очевидно.
Локальные переменные и параметры находятся в одной области видимости, поэтому - неважно, параметр имеет такое имя или локальная переменная, но в любом случае это имя скрывает имя во внешней области видимости.
Сокрытие никак не связано с копиями переменных, оно связано с именами сущностей. Да, хоть, с именами таких сущностей, как типы:
это компилируется:
$ icpc -c 1.cpp $
А это:
уже - нет:
Потому что имя A внутри функции - это уже не имя типа, а имя переменной-параметра. Имя типа, объявленной во внешней области видимости, теперь скрыто именем переменной-параметра. В этом можно косвенно убедиться, обнаружив что данный код:
вполне успешно компилируется:
$ icpc -c 1.cpp $
В MQL4++ такое не компилируется уже на стадии сокрытия имени типа именем переменной-параметра, то есть, даже с пустым телом функции:
результат:
Не знаю, почему, но я нисколько этому не удивлён.
Для C++ же никаких проблем с таким кодом нет:
результат попытки компиляции:
$ icpc -c 1.cpp $
Данный пример показывает, что сокрытие связано именно с именами сущностей, а не с чем-то ещё.
Если ремарка - неотключаемая, то - да, приходится изобретать всякие способы, типа коверканья имён. Но, если она - отключаемая, как в компиляторе Intel, то таких проблем нет.
В MQL4++ проблема не с самой функциональностью компилятора по детектированию сокрытия имён во вложенных областях видимости, а именно с принципиальной неотключаемостью этой функциональности.
Поэтому надо не предъявлять претензии о выдаче предупреждений, а исправлять свой код.
Претензия по обсуждаемым предупреждениям/ремаркам, думаю, может быть одна - об их принципиальной неотключаемости.
И, естественно, нельзя указывать программисту, что ему делать в пределах языка, а что - нет.
Подобные сообщения (скрытия глобальных переменных) в C++ просто бессмысленны (mql декларировался ведь как с++ подобный, верно?). Например, вот почему:
Подобные сообщения (скрытия глобальных переменных) в C++ просто бессмысленны (mql декларировался ведь как с++ подобный, верно?). Например, вот почему:
C++ здесь был взят потому, что в MQL4++ нет шаблонов структур/классов, - только шаблоны функций?
Я не уверен, знают ли об этом разработчики, но шаблоны классов возможны также и в MQL4++, хоть и с существенными ограничениями. В частности, данный пример может быть переложен на MQL4++ примерно следующим образом (также вместо локальной переменной в методе использован параметр):
при компиляции выскакивает одно-единственное предупреждение о сокрытии имени:
Если же закомментировать последнюю значащую строчку в OnStart(), предупреждение о сокрытии имени исчезает.
C++ здесь был взят потому, что в MQL4++ нет шаблонов структур/классов, - только шаблоны функций?
...
В целом да, но можно и на мкл: