Форум программистов, компьютерный форум, киберфорум
-=ЮрА=-
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  

using namespace std и std:: надоело смотреть!

Запись от -=ЮрА=- размещена 06.04.2012 в 22:30
Показов 18905 Комментарии 159
Метки c++

Наболело поэтому несколько эмоционально:
Кто нибудь понимает зачем используют using namespace std; и как глупо для каждой стандартной функции STD писать std:: - нееет???Ну тогда вам сюда в дискуссию!
Итак зачем вообще используют конструкцию using namespace std - ответ прост этим мы явно указываем компилятору что хотим использовать в своём коде функции из пространства имён STD
Тогда у многих встаёт вопрос: что означает конструкция std:: это явное указание области видимости? Ответ тоже прост : при такой записи компилятор также обращается к объекту(чаще всего это функция) следующего за вторым двоеточием. Итак что при использовании using namespace что при использовании std::мы всего лишь даём понять компилятору к какой функции и из какого пространства имён обращаться. А теперь у меня вопрос к вам, читающим всё это - Что это за инкубатор с std::, кто-то когда то по видимому безрукий ляпнул : "да будет std::, так правильно" и всё - понеслась. Каждый пытается обезопасить себя от какого-то потенциально опасного перекрытия пространства имён и т.д, хотя никакой опасности нет вообще.
Всем скептиками предлагаю код ниже
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
namespace my
{
    template <class T>
    T cout(T param)
    {
        return param;
    }
}
 
int main()
{
    cout<<"Test\n";
    cout<<my::cout("Test\n");
    system("pause");
    return 0;
}
Как видим ничего не случилось что в своей программе использую std::cout и my::cout
Вывод напрашивается сам собой - накой вообще везде лепить 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
Также привожу выжимку из Шильдта
using namespace std;
Эта инструкция делает пространство имён std текущим, что позволяет получить прямой доступ к именам функций и классов, определённых в библиотеке языка Standard Си, без необходимости каждый раз с помощью оператора расширения области видимости уточнять, что используется пространство имён std.
Тем не менее, если пожелаете, может перед каждым идентификатором ставить имя пространства имён std и оператор расширения области видимости - ошибки не будет.
Если в вашей программе не предусмотрено широкое использование библиотеки языка Standard C++, вы можете не вводить пространство имён std в глобальную область видимости.
Однако, если в вашей программе содержатся тысячи ссылок на стандартные библиотечные имена, включить в программу идентификатор std гораздо проще, чем добавлять его чуть ли не к каждой инструкции.
ссылка на первоисточник http://khpi-iip.mipk.kharkiv.e... lava13.pdf
Миниатюры
Нажмите на изображение для увеличения
Название: Безымянный.JPG
Просмотров: 318
Размер:	14.5 Кб
ID:	506  
Метки c++
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 159
Комментарии
  1. Старый комментарий
    Аватар для vxg
    Pure, сбило человека не явное квалифицирование, а стремление преподавателей оглупить тему. перед тем как писать, нужно думать. вот вы призываете использовать using. предлагаете это тем кто не знает, что за этим стоит. предлагаете использовать просто как иероглиф. чем вы лучше преподавателей Юры? ничем. вы хуже. потому, что преподаватели вбивали в голову безопасную конструкцию std:: которая будет работать как часы. да, при этом у вас болели пальцы. но вы были в безопасности. а вы предлагаете так же слепо клепать using, что уже совсем не безопасно и вообще у начинающих создаст видимость магии.
    Запись от vxg размещена 31.07.2012 в 15:16 vxg вне форума
  2. Старый комментарий
    Аватар для -=ЮрА=-
    Pure, тут поддержу
    Но самое важное во всем этом не упорство Юры. А то, что привело к этому. Его сбило именно явное квалифицирование, что лишний раз подтверждает факт того как воспринимаются замусоренные квалификаторами тексты. И стоит все таки признать, что using это классная фича призванная очистить код, то о чем говорит Юра, НО увы человеческий фактор может свести на нет все удобства языка.
    тут
    временного объекта там нет. Умей признавать ошибки.
    потомок содержит в себе весь хлам от предка. при вызове функции предка, специально предок не создается, потому что предок - часть потомка и уже создан.
    - хорошо этот аспект реально уточну и оставлю как бы под вопросом. Когда разберусь напишу даже признание что я не прав если это конечно так. Но ИМХО к теме спейсов это не имеет отношения.

    На счёт этого
    Бишь если вы пишете программу и подключаете сторонние либы, содержащие ОДИНАКОВЫЕ имена функций, вы должны понимать что вы делаете и зачем вам оное.
    - наконец-то вижу хоть одного человека, который начал курить или возможно сам пришёл к тому что пытаюсь донести!

    Давайте все успокоимся и ещё раз разберём ситуации
    Если функция из спейса перегружаема либо имеет отличное имя то надобности в явном указании области видимости НЕТ (как я понял явное указание через space:: вы это называете квалификаторами(что ж возможно за 7 лет после того как нам преподавали вещи поменяли свои имена), не важно)
    http://codepad.org/6g2Sjktp разные имена
    http://codepad.org/jdr5fDEY функция имеет перегружаемый прототип
    Пример с непергружаемой функцией из спейса я уже подал чуть ранее поэтому лишь слинкую на кодпад http://codepad.org/kqKQiYZF

    Таким образом никаких предпосылок к напичкиванию кода space:: нет. Я хочу чтобы на этой ноте мы остановились и перестали спорить - потому как я говорю сейчас дело, нравиться это или нет. Пора всем разрушить устоявшиеся принципы!
    Запись от -=ЮрА=- размещена 31.07.2012 в 15:42 -=ЮрА=- вне форума
  3. Старый комментарий
    Аватар для vxg
    ...а если класс или объект имеет имя или функция имеет сигнатуру совпадающую с имеющейся в подключаемом пространстве имен (нескольких пространствах содержащих тонны кода и так же возможно имеющих хотя бы несколько точек коллизии)? ведь именно для этого придумали пространства имен. что бы разруливать такие моменты. вариант когда коллизий нет по-моему не имеет смысла рассматривать как очевидный. для него, безусловно, можно все подключить и спать спокойно.
    Запись от vxg размещена 31.07.2012 в 15:50 vxg вне форума
  4. Старый комментарий
    Аватар для -=ЮрА=-
    vxg , можешь пояснить свой пост конкретным примером(верней накидай пару слинкованных строк, который при using namespace дадут коллизию), я нигде не писал что внутри спейса писать using namespace но если надо и это можно. Теперь хочу конкретно увидеть что ещё осталось не обсуждённым и возможно требует кода для лучшего понимания.
    Запись от -=ЮрА=- размещена 31.07.2012 в 16:03 -=ЮрА=- вне форума
  5. Старый комментарий
    Аватар для Pure
    Цитата Сообщение от vxg
    . ведь именно для этого придумали пространства имен.
    мне все таки видится что не именно для этого. Пространства имен позволяют создавать гибкие интерфейсы. В принципе об этом пишет "отец" языка Страуструп, и это действительно так.
    Почему ты рассматриваешь возможность языка, как избегание неприятностей? Это не совсем верно.
    Возможность - это нечто позитивное, расширяющее функционал. Да при помощи оного можно исправить "бесконтрольные фантазии" разрозненных разработчиков, однако это не есть главное достоинство, но лишь костыль, исправляющий ошибки человека, который вопреки тем же ученьям, слишком много выносит в глобальную видимость.
    И опять в твоем примере "а если" ты ориентируешься на тот код (да к сожалению его много), который не был продуман и спроектирован а писался тогда, когда вероятно людям в голову не приходило, что программирование получит такое развитие. Поэтому неверно учится писать std:: везде, на всякий случай. Правильно ориентироваться на грамотное построение проекта, организацию людей, на качественное написание своего кода в конце концов.
    а то получается так - пишу как хочу
    C++
    1
    
    int a(int z,int r){return z*r;}
    а потом заворачиваю это в пространство имен, ну чтоб уж сигнатура не совпала.
    Онозначно не такая идея заложена в пространства.
    Поэтому доказывать всем и поучать что надо везде совать std:: - толкать новичков к отсутствию понимания, а для чего все это было сделано, и давать им возможность безболезненно писать парашу.
    Однако есть те самые случаи когда вы накундяпкали что то и у вас получилось, что одинаковые сигнатуры торчат, в этом случае да - явная квалификация и это вам сигнал, что в проекте явно что то не так
    Запись от Pure размещена 31.07.2012 в 16:22 Pure вне форума
  6. Старый комментарий
    Аватар для vxg
    "можешь пояснить свой пост конкретным примером" - не совсем понимаю, какой пример вы от меня хотите, тут вроде все уже на 15 страницах перепахано, но если еще раз, то что то вроде
    http://codepad.org/VNoJIK4L
    ----
    Pure:
    "Пространства имен позволяют создавать гибкие интерфейсы" - пример пожалуйста. терминология незнакомая.
    "Почему ты рассматриваешь возможность языка, как избегание неприятностей" - весь язык - это способ избегания неприятностей - все в нем подчинено разукрупнению задач, изоляции кода, и так далее. читать книгу Гради Буч Объектно-ориентированный анализ и проектирование. жил был ассемблер. людям стало разрывать по швам мозг. сделали си. снова давит в висках. сделали си плюс плюс. каждый шажок - избегания неприятностей заключающихся в конечной пропускной способности человеческого мозга. к чему вы толкаете новичков я вообще не понял. э, вы чьих будете ?
    Запись от vxg размещена 31.07.2012 в 16:37 vxg вне форума
  7. Старый комментарий
    Аватар для Pure
    ОН наполовину полон или наполовину пуст?

    это не избегание неприятностей - а расширение возможностей, именно возможностей по созданию, по отходу от привязки к конкретному железу, по ускорению и упрощению разработки.Уже сейчас программирование доступно куда как большему числу людей. Видимо у нас разный взгляд на вещи.
    Запись от Pure размещена 31.07.2012 в 16:59 Pure вне форума
  8. Старый комментарий
    Аватар для vxg
    "ОН наполовину полон или наполовину пуст" - если вас интересует подобный тупизм, то ОН наполовину пуст, поскольку объем пустого пространства больше объема воды. поставьте напротив себя цилиндрический стакан и зациклитесь если вам так нравится.
    ----
    "это не избегание неприятностей" - если бы люди не столкнулись с проблемой нестабильности (да и вообще принципиальной невозможностью создания) программ объемом в N тысяч строк они бы не озаботились разработкой подходов которые вам нравится называть возможностями.
    ----
    кроме тафталогии - что там про "Пространства имен позволяют создавать гибкие интерфейсы"?
    Запись от vxg размещена 31.07.2012 в 17:07 vxg вне форума
  9. Старый комментарий
    Аватар для -=ЮрА=-
    не совсем понимаю, какой пример вы от меня хотите, тут вроде все уже на 15 страницах перепахано, но если еще раз, то что то вроде http://codepad.org/VNoJIK4L
    - и вот это сложность)))Мой ответ здесь http://codepad.org/GFu7aWlz
    Запись от -=ЮрА=- размещена 31.07.2012 в 17:11 -=ЮрА=- вне форума
  10. Старый комментарий
    Аватар для -=ЮрА=-
    vxg я даже снабжу свой код коментами, дабы любой начинающий мог сие осознать
    C++
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    
    #include <string>
    #include <iostream>
     
     
    namespace My
    {
        class string
        {
        private:
            int _val;
        public:
            string(){_val = 0;};
            string(int val){_val = val;}
            template <class T>
            T add(T a, T b)
            {
                return (_val = a + b);
            }
            int GetVal(){return _val;}
        };
     
        void swap(string& first, string& second)
        {
            string val = second;
            second = first;
            first  = val;
        }
    }
     
    int main()
    {
        My::string c1, c2;
        c1 = 1;
        c2 = 2;
        {
            using namespace std;
            cout<<"c1 = "<<c1.GetVal()<<endl;
            cout<<"c2 = "<<c2.GetVal()<<endl;
            
            cout<<"std::swap\n";
            swap(c1,c2);//Þçàåì STD swap
            cout<<"c1 = "<<c1.GetVal()<<endl;
            cout<<"c2 = "<<c2.GetVal()<<endl;
        }
        {
            using namespace My;
            swap(c1,c2);//À ýòî ñâàì óæå èç ìîåãî ñïåéñà My
            //åñëè ñëîæíî â ýòî ïîâðåèòü ïðåäëàãàþ çàêîìåíòèðîâàòü
            //â òåëå void swap(string& first, string& second)
            //âîò ýòó ñòðîêó //first  = val;
            //è ïîãëÿäåòü íà îòðàáîòêó
        }
        {
            using namespace std;
            string str = "My::swap";//Òóò âîîáùå std::string èñïîëüçóåì âìåñòå ñ My::string
            cout<<str<<endl;
            cout<<"c1 = "<<c1.GetVal()<<endl;
            cout<<"c2 = "<<c2.GetVal()<<endl;
             
        }
        return 0;
    }
    Запись от -=ЮрА=- размещена 31.07.2012 в 17:14 -=ЮрА=- вне форума
  11. Старый комментарий
    Аватар для -=ЮрА=-
    Ну фуууух постов не нблюдаю, надеюсь дискуссия окончилась
    Запись от -=ЮрА=- размещена 31.07.2012 в 17:33 -=ЮрА=- вне форума
  12. Старый комментарий
    Аватар для Pure
    Цитата Сообщение от vxg
    "ОН наполовину полон или наполовину пуст" - если вас интересует подобный тупизм, то ОН наполовину пуст, поскольку объем пустого пространства больше объема воды. поставьте напротив себя цилиндрический стакан и зациклитесь если вам так нравится.
    ----
    "это не избегание неприятностей" - если бы люди не столкнулись с проблемой нестабильности (да и вообще принципиальной невозможностью создания) программ объемом в N тысяч строк они бы не озаботились разработкой подходов которые вам нравится называть возможностями.
    ----
    кроме тафталогии - что там про "Пространства имен позволяют создавать гибкие интерфейсы"?
    не понравилось. а ведь это факт. Везде видеть избегание неприятностей или наличие возможностей принципиально разные подходы и не только в программировании.
    Ну а про интерфейс..Например можно сделать набор функционала, включить его в коммон спэйс.
    А затем создать 2 спэйса, например ридонли - и в нем используя, так тобой нелюимое using declaration добавить функционал только читающий, и спэйс райтонли, там только пишуший. Но это так первое что пришло в голову. А в основной проге в зависимости от подключения спэйса получишь либо пишущий либо читающий набор
    Запись от Pure размещена 31.07.2012 в 17:37 Pure вне форума
  13. Старый комментарий
    Аватар для vxg
    "и вот это сложность" - это не сложность, это пример, вы ведь просили, я прекрасно понимаю, что он может быть решен быстро и разными способами - это ведь не задача ХТЯС. да, так как вы делаете можно делать - это очевидно - объявления объектов и вызов функций в соответствующих областях действия явно указанных при помощи using работают. однако даже на этом коротком примере мы видим какое количество using нам понадобилось (при достаточно развитом коде символов может быть даже больше чем при написании префиксов) и как жестко был фрагментирован код при помощи фигурных скобок (со всеми побочными эффектами наподобие уничтожения объектов объявленных в соответствующем блоке кода при выходе из него - для чего нам эти лишние движения, о потенциальной опасности я даже не говорю - читабельность задвигается) используемых исключительно для того, что бы такой подход работал.
    ----
    Pure - я тоже читал книжки по мозговедению, у меня тоже хороший тезаурус, я тоже могу рассказать как построить звездолет, в общем бла бла бла
    Запись от vxg размещена 01.08.2012 в 09:23 vxg вне форума
  14. Старый комментарий
    Аватар для -=ЮрА=-
    (при достаточно развитом коде символов может быть даже больше чем при написании префиксов) и как жестко был фрагментирован код при помощи фигурных скобок (со всеми побочными эффектами наподобие уничтожения объектов объявленных в соответствующем блоке кода при выходе из него - для чего нам эти лишние движения,
    Поясню, к примеру пишем
    std::cout<<val<<std::endl;//Два префикса на 1 несчастную строку, а если таких строк N*1000 (N E 1...K) встаёт вопрос, зачем?Допустим в коде надо будет ещё вызвать 3,4 функции из сторонних спейсов - не вопрос делаем это как space::function, но если таких выззовов тоже надо пару сотен сделать, то простите сударь вы недалёкий человек раз плодите префиксы - и против такой ИМХО глупости я буду протестовать и далее...
    Не знаю смотрели ли вы пример со class string но думаю видно что никаких проблем и в этом случае не возникло.
    От себя добавлю - много проблем возникает из за неоптимального кода, неоптимальной реализации и т.д. В таких случаях людям простите мешает все и даже то что мешает плохим танцорам и винить в своих огрехах using namespace это просто глупость.


    Надеюсь вместо заключения: Уважаемые мы тут много уже повоевали давайте оставим всё как есть, тот кто всё это прочтёт и сам способен сделать выводы...
    Запись от -=ЮрА=- размещена 01.08.2012 в 09:48 -=ЮрА=- вне форума
  15. Старый комментарий
    Аватар для taras atavin
    [QUOTE]#include <iostream>
    using namespace std;
    namespace my
    {
    template <class T>
    T cout(T param)
    {
    return param;
    }
    }

    int main()
    {
    cout<<"Test\n";
    cout<<my::cout("Test\n");
    system("pause");
    return 0;
    }
    Как видим ничего не случилось что в своей программе использую std::cout и my::cout
    Вывод напрашивается сам собой - накой вообще везде лепить std:: если даже без явного указания области видимости ничего страшного не произойдёт даже при использовании другого namespace-а[/QUOTE]Бред несёшь. Два пространства имён, из которых одно своё мешать друг другу не могут в принципе, а вот если ты напишешь [CPP]using namespace std;[/CPP], а потом вдруг декларируешь [B]безо всякого неймспейса[/B] свой cout ([CPP]#include <iostrem>
    using namespace std;
    double cout;[/CPP], вот тогда проблема будет и заключаться она будет в том, что после появления одной декларации придётся отлавливать обращения к кауту по всей проге. А если это ещё и тоже поток, но своего класса, например, голосовой, то вычитывать, не полагаясь на сообщения и поиск. Проще заранее не связываться с using, либо ни когда не перекрывать. Причём, чтоб не перекрывать, требуется доскональное знание всего std. Можно сказать, что профессионал обязан знать, чем пользуется и я с этим даже соглашусь. Но как быть с новичками в процессе изучения как раз std? Они то доскональное его знать не могут, а писать через него надо. Ну а потом уже по привычке шлёпаешь четвероточие.
    Запись от taras atavin размещена 19.03.2014 в 16:56 taras atavin вне форума
  16. Старый комментарий
    Аватар для BRcr
    Глобальных объявлений вообще стоит избегать, а уж глобально использовать using namespace - вот это действительно бред. На кой оно надо-то?
    А если речь о любой локальной области видимости, то даже самый распоследний нуб в состоянии понять, что перекрыл что-то из другого namespace, если ему вдруг понадобится это что-то использовать.
    Запись от BRcr размещена 19.03.2014 в 17:35 BRcr вне форума
  17. Старый комментарий
    Аватар для taras atavin
    По всей проги десятки тысяч раз втыкать локально один и тот же [CPP]using namespace std;[/CPP] - вот эталон бреда. Подобная декларация как раз и нужна ради того, чтоб написать её один раз, а если писать каждый раз, так четвероточие короче.
    Запись от taras atavin размещена 19.03.2014 в 17:45 taras atavin вне форума
  18. Старый комментарий
    Аватар для BRcr
    Если у тебя десятки тысяч локальных областей, где по одному разу делается обращение к объекту из std - тогда да. Если у тебя в одной из локальных областей множественное обращение к объектам из определенного namespace, тогда логичней использовать один раз using, чем много раз спецификацию namespace, которая состоит, кстати, не из одного лишь "четвероточия". И не надо паники, здесь все свои.
    Запись от BRcr размещена 19.03.2014 в 18:05 BRcr вне форума
  19. Старый комментарий
    Аватар для taras atavin
    Так имя так и так писать.
    Запись от taras atavin размещена 19.03.2014 в 18:10 taras atavin вне форума
 
Новые блоги и статьи
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru