using namespace std и std:: надоело смотреть!
Запись от -=ЮрА=- размещена 06.04.2012 в 22:30
Показов 18588
Комментарии 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
Комментарии
-
Запись от soon размещена 06.04.2012 в 22:38
-
Тем что абсолютно никаких привилегий данная конструкця (я об std:: ) не даёт. Зачем использовать то что "не делает нас лучше"?А вот свой код увеличиваешь на процентов 30. Есть такое понятие как эффективность кода, так вот эффективность 600-та знаков с std:: будет ничем не больше чем эффективность 400-ста или даже 200-ста с using namespace std; Причём абсолютно никаких проблем с перекрёным использованием namespace-ов с идентичными названиями функций.
Именно, использующие std:: страхуются от несуществующих проблем, хотя как я уже указал
PS: Даже MSDN даёт код с using namespace std; очевидно там не дураки сидят и приводят данную конструкцию чтобы люди учились сокращать свой код, а не творили глупость!Запись от -=ЮрА=- размещена 07.04.2012 в 09:29
-
Запись от programina размещена 07.04.2012 в 09:41
-
Запись от soon размещена 07.04.2012 в 12:12
-
Вот когда напишешь проект размером в миллионы тысяч строк, да ещё попытаешься переносить его между разными стандартами языка, тогда поймёшь, для чего это надо. Допустим, у тебя есть функция venik и твоя программа нормально работает. Теперь выходит новая версия стандарта языка Си++, в которую включена функция с именем venik. После чего у тебя программа либо перестанет компилироваться, либо, не дай боже, скомпилируется, но искать ошибку ты будешь до пенсии. В namespace std включено всё то, что входит в стандарт языка Си++. Поэтому явное использование "std::" гарантирует тебе, что у тебя не будет проблем при переходе на новые версии стандарта или на другие версии компилятора, с другими заголовочными файлами. Можно, конечно, прочитать все версии стандарта Си++, прочитать все стандарты по разным системам (windows, posix, sysv, ...) на предмет того, чтобы выяснить весь список глобальных имён, которые могут присутствовать в заголовочных файлах. Но намного дешевле выходит постоянно тратить лишнюю секунду времени и написать "std::", чем в один прекрасный момент потратить туеву хучу времени на отладку при изменении внешних факторов (при переносе на другой компилятор, на другую систему и т.п.)
Кстати точно так же возмущаются те, кто перешёл с бэйсика на си. Дескать нафига объявлять переменные, пусть как в бэйсике работает без объявления
Ну и пример тебе в тему https://www.cyberforum.ru/cpp-... 48052.html
> PS: Даже MSDN даёт код с using namespace std
MSDN это по сути пособие для школьников. Чтобы их не заваливали идиотскими вопросами дескать а почему у меня на компиляторе 1990-го года выпуска не работает std::cout. Намного дешевле (по деньгам, по времени, по нервам) вписать в свои коды "using namespace std", чтобы оно работало и на старых и на новых компиляторах, чем по 100500 раз как попугай каждому идиоту объяснять одно и то жеЗапись от Evg размещена 07.04.2012 в 12:18
-
- Это всё решается написанием "своего веника в своём namespac-е" Поэтому хоть в 2942 функция веник написанная в namespace my будет работать всё также хорошо как и сейчас
Код я тоже не просто так поцепил!
Если уж пишем как "взрослые дяди" то давайте писать как "взрослые дяди", свой код в свой нэймспейс и не мучаемся, а пространство имён STD используем как базовое.C++ (Qt) 1
cout<<my::cout("Test\n");
Всем желающим предлагаю изменить название T cout(T param) на "веник" и наслаждаться, а можно и не менять и всё равно наслаждаться
- Это ни есть аргумент, но нравиться пиши, лишь бы людей не сбивал фразами std:: лучше
- может и 50% тут всё от кода зависит. По крайней мере сокращение длинны кода это уже аргумент
Подытожу одной поговоркой : "Краткость сестра таланта"Запись от -=ЮрА=- размещена 07.04.2012 в 13:05
-
Просто потрясающая логика. Когда стандартные функции напиcаны в namepace - это неправильно. Правильно - когда ВСЕ свои коды написаны в namespace.
Ещё раз хочется сказать, пока ты пишешь свои программы, в которых своего нет почти ничего, а одни лишь обращения к стандартным функциям, то тебе и кажется, что std:: - это 50% кода. А вот когда реально большая программа в которой почти весь код свой - там ситуация обратная. Почти все вызовы свои (и их логичнее сделать без namespac'ов) и лишь небольшая часть - обращение к std::Запись от Evg размещена 07.04.2012 в 13:17
-
Запись от soon размещена 07.04.2012 в 13:19
-
где я такое писал либо приводил?
Своим кодом имитировал ситуацию когда в нашем наймспейсе идёт объект (не важно функция, манипулятор и т.д.) совпадающий по имени со стандартным. Как видим using namespace std; сделал наше STD базовым, а обращение к своим функциям я осуществляю через my::.
- Evg в любом случае даже в самописных функциях все используют стандартные конструкции и в твоём коде они тоже есть. По поводу длинны кода, отвечу что не стоит судить о каких-либо моих приложениях лишь по тому что выставляю на форуме (во первых что нибудь по настоящему ценное я держу как козырь в рукаве а во вторых если чем-то и свечу им то только за деньги).
- тогда ок.
- да легко
Сравнивай длинну кодов. При подсчёте изыми длинну строк и считай как будто выводился и вводился 1 символ(ведь мы можем и целое изложение в кавычках написать а можем и букву)
Итак using namespace std;
Код с std::C++ (Qt) 1 2 3 4 5 6 7 8 9 10 11 12 13 14
#include <iostream> using namespace std; int main() { int val; cout<<"Enter int value : "; if(!(cin>>val)) cout<<"Input error\n"; else cout<<"Your input : "<<val<<endl; system("pause"); return 0; }
Код main увеличился на 25-ть символов, хотя разницы в функционале никакой, так зачем тогда вообще использовать std::???C++ (Qt) 1 2 3 4 5 6 7 8 9 10 11 12 13
#include <iostream> int main() { int val; std::cout<<"Enter int value : "; if(!(std::cin>>val)) std::cout<<"Input error\n"; else std::cout<<"Your input : "<<val<<std::endl; system("pause"); return 0; }
Запись от -=ЮрА=- размещена 07.04.2012 в 16:45
-
Запись от Pure размещена 07.04.2012 в 23:36
-
Pure, мне не очень ясен смысл твоего выссказывания в плане пойдёт.
Не по теме:
Мне пойдёт написание приложений с оконным (неконсольным) интерфейсом. И дело тут не в том что консоль вызывает у меня лишь улыбку умиления, дело в другом.
Да твой вариант уже лучше чем тупое прописывание std:: в коде. Тут вот какая штука: ты написал компилятору "используй оператор вывода из STD" ну гуд, только для полного функционала ещё надо написать using std::cin потом если используем std::string то ещё написать uisng std::string и так можно прописывать использование вырванных из контекста операторов и функций до бесконечности. Зачем городить вот такую пирамиду
если это всё можно заменитьC++ (Qt) 1 2 3
using std::cout; using std::cin; using std::string;
В любом случае твой вариант уже шаг вперёд в плане сокращения длинны кода и его прозрачности. По поводу приведнной в предудущем посте от Evg ссылки на необъяснимый баг в коде отвечу, что с такой проблеммой столкнулся и решил её где то лет 6 назад (когда был на 2-м курсе). Её суть: в коде Evg присутсвовала переменная y1, в math.h существует функция с подобным именемC++ (Qt) 1
using namespace std;
Вот кусок math.h
Проблемма Evg решается в один присест выносом его функций в namespce Evg и вызововм их в программе посредством Evg:: При этом конструкция using namespace std; никак не повлияет на его код. Чтобы не быть голословным вот ссылка с рабочим кодомC 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
#endif /* ndef _MAC */ #ifndef __assembler /* Protect from assembler */ _CRTIMP extern double HUGE; _CRTIMP double __cdecl cabs(struct _complex); _CRTIMP double __cdecl hypot(double, double); _CRTIMP double __cdecl j0(double); _CRTIMP double __cdecl j1(double); _CRTIMP double __cdecl jn(int, double); int __cdecl matherr(struct _exception *); _CRTIMP double __cdecl y0(double); _CRTIMP double __cdecl y1(double); _CRTIMP double __cdecl yn(int, double);
https://www.cyberforum.ru/cpp-... ost2885840Запись от -=ЮрА=- размещена 08.04.2012 в 09:51
-
Запись от ForEveR размещена 19.04.2012 в 14:28
-
О, совсем забыл про этот блог.
Спасибо diagon-у за код
C++ 1 2 3 4 5 6 7 8 9 10 11 12 13 14
#include <iostream> #include <vector> #include <iterator> int main() { std::vector< int > my_array ( std::istream_iterator< int > (std::cin), std::istream_iterator< int > () ); std::cout << my_array.size() << std::endl; }
Запись от soon размещена 19.04.2012 в 14:45
-
Запись от -=ЮрА=- размещена 19.04.2012 в 14:57
-
Так же по поводу рук из одного места
ОтработкаC++ 1 2 3 4 5 6 7 8 9 10 11 12 13 14
#include <iostream> #include <vector> using namespace std; int main() { int val; vector < int > my_array; while(cin>>val) my_array.push_back(val); cout << my_array.size() << endl; system("pause"); return 0; }
5
6
7
g
3
Для продолжения нажмите любую клавишу . . .
Т.е. если пишем не через ж то всё работает. В общем вы сами себе придумываете проблем, там красиво написать ввод или ещё что либо, вот скажи чем цикл хуже итератора?В коде на один хедер меньше и строк тоже меньше, у меня ведь system("pause"); ещё есть!Ну а так да ты привёл хорошый пример чтобы водить себя за нос
Запись от -=ЮрА=- размещена 19.04.2012 в 15:00
-
Нормальные примеры работы с веторами
http://www.cplusplus.com/refer... or/vector/
По ссылке ниже найдём и двумерные вектора
http://www.codeproject.com/Art... t-1-Vector
Мне понравился вот этот момент
Вообще по поводу векторов я уже писал здесьC++ 1 2 3 4 5 6 7 8 9 10
vector< vector<double> >::iterator it2d; vector<double>::iterator it1d; for(it2d = matrix.begin(); it2d != matrix.end(); it2d++) { for(it1d = (*it2d).begin(); it1d != (*it2d).end(); it1d++) { cout << *it1d << " "; } cout << endl; }
https://www.cyberforum.ru/blog... omment1614
Запись от -=ЮрА=- размещена 19.04.2012 в 15:24
-
Писюкай ка ты на сях или в своем MFC родной. Смысла в векторах он не видит совершенно. Пф. Знаешь такое понятие как красота кода? Так вотзначительно краше, нежели заполнение циклом. А еще лямбда ща появились и т.д. Крайне сомневаюсь что ты их будешь использовать (как и остальные фичи С++11).C++ 1
std::vector<int>((std::istream_iterator<int>(std::cin)), std::istream_iterator<int>());
Запись от ForEveR размещена 19.04.2012 в 15:38
-
И да. На тебе без буста.
Разреши эту колизию, не убирая using-ов, не добавляя using-ов, не добавляя явную спецификацию пространства имен перед string.C++ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
#include <string> namespace my { class string { }; } using namespace my; using namespace std; int main() { string s; }
Запись от ForEveR размещена 19.04.2012 в 15:43
-
Насмешил)))
Во первых я нигде абсолютно даже в примере здесь
https://www.cyberforum.ru/cpp-... ost2885840
не делал базовыми два нэймспейса, всегда базовым было std.
По поводу задчи держи
http://codepad.org/9OrGJVuNC++ 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
#include <iostream> #include <string> using namespace std; namespace my { class string { private: char sMSG[64]; public: string(){}; char * cout(const char * msg) { return strcpy(sMSG,msg); } }; } int main() { string s = "Test\n"; cout<<s<<endl; my::string p; cout<<p.cout("Especially 4U\n")<<endl; system("pause"); return 0; }
перед std::string я её и не вводил.
Квинтессенцией моего блога является
, а свои неймспейсы раскрываем через :: в любом случае мы что при std:: так поступаем что в моем варианте.
Ещё раз для тебя, возможно тебе надо более одного раза объяснять
, особой надобности в конструкции std:: нет, а все проблеммы с ней решаются за пару минут, верней их нет, писать надо уметь
Запись от -=ЮрА=- размещена 19.04.2012 в 15:59
-
Слушай писюкай лучше ты в своей консоли и старайся не трепать языком как помелом причём в основном бестолку. Красота кода говоришь, мне вообще достаточно делать что либо аля
DWORD * dwData = (DWORD *)lpWaveData;
и не ломать голову с векторами
Индексацияю показывать или способен сам додумать?
А если бы ты был прогером со стажем то знал что ничего моложе 3-х лет (а у тебя стандарт 11-года), вообще не нужно брать в работу, т.к. болле менее норм обкатка всего (и функций и алгоритмов) минимум идёт 3 года и те кто гоняться за новизной зачастую проигрывают потом, когда выясняется что это новое полно дыр!Запись от -=ЮрА=- размещена 19.04.2012 в 16:06


Своим кодом имитировал ситуацию когда в нашем наймспейсе идёт объект (не важно функция, манипулятор и т.д.) совпадающий по имени со стандартным. Как видим using namespace std; сделал наше STD базовым, а обращение к своим функциям я осуществляю через my::. 
, особой надобности в конструкции std:: нет, а все проблеммы с ней решаются за пару минут, верней их нет, писать надо уметь
