using namespace std и std:: надоело смотреть!
Запись от -=ЮрА=- размещена 06.04.2012 в 22:30
Показов 18846
Комментарии 159
Метки c++
|
Наболело поэтому несколько эмоционально: Кто нибудь понимает зачем используют using namespace std; и как глупо для каждой стандартной функции STD писать std:: - нееет???Ну тогда вам сюда в дискуссию! Итак зачем вообще используют конструкцию using namespace std - ответ прост этим мы явно указываем компилятору что хотим использовать в своём коде функции из пространства имён STD Тогда у многих встаёт вопрос: что означает конструкция std:: это явное указание области видимости? Ответ тоже прост : при такой записи компилятор также обращается к объекту(чаще всего это функция) следующего за вторым двоеточием. Итак что при использовании using namespace что при использовании std::мы всего лишь даём понять компилятору к какой функции и из какого пространства имён обращаться. А теперь у меня вопрос к вам, читающим всё это - Что это за инкубатор с std::, кто-то когда то по видимому безрукий ляпнул : "да будет std::, так правильно" и всё - понеслась. Каждый пытается обезопасить себя от какого-то потенциально опасного перекрытия пространства имён и т.д, хотя никакой опасности нет вообще. Всем скептиками предлагаю код ниже
Вывод напрашивается сам собой - накой вообще везде лепить std:: если даже без явного указания области видимости ничего страшного не произойдёт даже при использовании другого namespace-а Код с двоеточиями, нечитабелен, абсолютно такой же по функционалу что и код без std::. И ещё один момент - кто нибудь в MSDN-е встречал код с std:: именно официальный код???Ну хорошо из 100 кодов возможно пара содержит std::, остальная же часть кода дана с using namespace std; как такая которая позволяет сокращать код (прелагаю посчитать на сколько символов увеличивает std:: в каждой строчке длинну кода). Таким образом конструкция using namespace std целесообразней в плане сокращения длинны кода, нежели std::. Все гипотетичекие проблеммы перекрёстного использования пространств имён с одинаковыми функциями надуманы и обусловлены кривостью чьих-то рук, либо неправильным их расположением(я о руках) не из того места. Добавлено мной 31.07.2012 Тема оказалась душетрепещущей - предлагаю для ускорения понимания перепрыгивать с 1-й страницы сюда https://www.cyberforum.ru/blog... omment3371 и сюда https://www.cyberforum.ru/blog... omment3378 Также привожу выжимку из Шильдта
| ||||||
Метки c++
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 159
Комментарии
-
При этом Forever мой код попроще будет и внутри {} можно будет использовать функции конкретного неймспейса(думаю очевидно что для одной функции лучше было бы записать std::swap My::swap а вот если надо будет поюзать строк 80 кода именно с функциями конкретного спейса то это как раз самое оно. Кстати я об этом писал что допустимо в сложном коде для пары вызовов юзать space:: а не городить времянку. Я не против этого, я против тотального space:: к каждому будяку в кодеЗапись от -=ЮрА=- размещена 31.07.2012 в 13:34
-
Запись от -=ЮрА=- размещена 31.07.2012 в 13:36
-
Про вызов статического метода...
Вообщем никакого временного объекта естественно нет. Ну ты бы хоть книжку почитал что-ли или стандарт, прежде чем спорить, право.
Pure, о нет. Ты дико не прав. Это управление на этапе написания/компиляции, никак не на этапе выполнения. И код некомпилябельный чуть более чем полностью http://liveworkspace.org/code/... ebb185395aЗапись от ForEveR размещена 31.07.2012 в 13:40
-
пример для 1 http://codepad.org/mdbeqZHPЗапись от vxg размещена 31.07.2012 в 13:43
-
пример для 2 http://codepad.org/KZXSSJMWЗапись от vxg размещена 31.07.2012 в 13:48
-
пример для противопоказаний к использованию using опишу словами.
если у вас есть одноименные классы: глобальный, в пространстве one и в пространстве two и вы интенсивно используете в коде эти классы, то, очевидно без использования указания области видимости вам придется постоянно переключать пространства имен, что не очень эстетично и может быть опасно так как напоминает работу с операторскими скобками - забыл поставить лишний using и программа начала работать по другому. если, как уже упоминалось, конструкторы вызываются в неком выражении - вообще нет возможности решить такую ситуацию при помощи using. пример, безусловно, рассматривает самый худший и практически не встречающийся вариант, но какие-то черты этого примера могут проявляться и в реальных проектах.Запись от vxg размещена 31.07.2012 в 13:53
-
в использовании пространства имен и статических функций/данных классов есть определенное сходство за исключением того, что для статических членов класса нет аналога using. на это сходство я и указал где-то в начале. в рамках такого подхода использование префиксов с указанием области видимости выглядит гармоничным и полностью вписывается в объектно-ориентированный подход. использование using, при таком рассмотрении, напоминает хук наподобие goto. может поэтому люди и пишут std::Запись от vxg размещена 31.07.2012 в 13:56
-
А вы сами собственно как пишите? Часто используете using? Я например пишу на работе, мы не используем директив/деклараций using (почти) потому как используем достаточно много различных пространств имен и базового по большому счету нет да и код без using мне нравится куда больше, чем такой же, но с using-ом, по крайней мере сразу понятно что к чему.
Сообщение от vxg
Запись от ForEveR размещена 31.07.2012 в 13:59
-
не совсем. однако в ++ namespace сделан иначе. Признаю изначально первый CHOICE был вынесен над main, от этого первая распечатка была корректна, затем внутри мэйна еще один нэймспэйс перекрывал глобальный и отрабатывала вторая распечатка, т.е. было 2 спэйса с одинаковым именем, это ввело меня в заблуждение (радостное), что в ++ так же как в АС этим можно управлять и я переместил первый спэйс внутрь, и естественно все стало на свои места). печаль)). но язык развивается и думается мне, что это поправят, если возникнет надобность. Ну а про остальное, от своих слов не отказываюсь. конфликты - это скорее от несогласованности разработки. уж это вполне очевидно. это некий "костыль" который исправляет последствия человеческого фактораЗапись от Pure размещена 31.07.2012 в 14:08
-
Запись от vxg размещена 31.07.2012 в 14:09
-
Запись от ForEveR размещена 31.07.2012 в 14:10
-
это по сути вечный спор, как и в смежных темах. УДОБСТВО.
Сообщение от vxg
специально что СКРЫТЬ длинные конструкции в язык ввели typedef. Поскольку длинные конструкции усложняю восприятие.
Поэтому вопрос выглядит так:
какой выбор, облегчить написание кода (в плане отсутствия конфликтов с тем что писали другие) или облегчить восприятие кода, теми кто будет его читать.
Что чаще делают пишут или читают код? Ответ даст результат в пользу одного или второгоЗапись от Pure размещена 31.07.2012 в 14:18
-
Запись от ForEveR размещена 31.07.2012 в 14:18
-
Запись от vxg размещена 31.07.2012 в 14:23
-
Запись от Pure размещена 31.07.2012 в 14:27
-
Касательно call-ов функций и временных объектов
http://codepad.org/cMk2cX9l
т.е наличие объекта предполагается. Вообще же мой пост о CDialog:: преследовал следующие цели
в коде можем записать
CDialog::SetWindowText
CDialog::GetClientRect
и т.д. а можем сразу пользоваться тем что все эти функции уже унаследованы - т.е просто вызывать их по имени. Причём если мы их не перегрузим сами как я проделал это с SetWindowText то будет работать прототип CDialog::SetWindowText -> CWnd::SetWindowText но это не значит что я не могу перегрузить CDialog::SetWindowText равно как и такую же для послдеующих классов котороые наследуют CDialog. Т.е таким же образом можно использовать using namespace которая явно указывает компилятору функциями какого спейса надо оперировать и в space:: уже нет надобностиЗапись от -=ЮрА=- размещена 31.07.2012 в 14:27
-
Запись от Pure размещена 31.07.2012 в 14:29
-
Запись от ForEveR размещена 31.07.2012 в 14:31
-
Запись от vxg размещена 31.07.2012 в 14:33
-
-=ЮрА=-,временного объекта там нет. Умей признавать ошибки.
потомок содержит в себе весь хлам от предка. при вызове функции предка, специально предок не создается, потому что предок - часть потомка и уже создан.
Но самое важное во всем этом не упорство Юры. А то, что привело к этому. Его сбило именно явное квалифицирование, что лишний раз подтверждает факт того как воспринимаются замусоренные квалификаторами тексты. И стоит все таки признать, что using это классная фича призванная очистить код, то о чем говорит Юра, НО увы человеческий фактор может свести на нет все удобства языка.
Т.е. по хорошему те книжки, которые учат писать std:: по каждому чиху, призывают не к продуманному проектированию и согласованию действий разработчиков, а к некому ИЗБЕГАНИЮ тех проблем, которые уже наворочали задавая одинаковые имена имеющие глобальную видимость и подключая к проектам разные либы содержащие ОДИНАКОВЫЕ имена переменных и функций. Бишь если вы пишете программу и подключаете сторонние либы, содержащие ОДИНАКОВЫЕ имена функций, вы должны понимать что вы делаете и зачем вам оное.Запись от Pure размещена 31.07.2012 в 14:33


