AKE 12 / 12 / 3 Регистрация: 09.05.2010 Сообщений: 384 |
||||
1 |
||||
14.05.2010, 00:16. Показов 28674. Ответов 17 Метки нет (Все метки)
error C2871: ‘std’ : does not exist or is not a namespace Microsoft VC++ 6.0
__________________
0 |
бжни 2473 / 1684 / 135 Регистрация: 14.05.2009 Сообщений: 7,162 |
|
14.05.2010, 00:24 |
2 |
вы должные включить заголовки, которые чтонибудь туда добавят, например #include <vector> #include <iostream>
0 |
12 / 12 / 3 Регистрация: 09.05.2010 Сообщений: 384 |
|
14.05.2010, 00:27 [ТС] |
3 |
alex_x_x
0 |
229 / 67 / 11 Регистрация: 02.06.2009 Сообщений: 280 |
|
14.05.2010, 12:35 |
4 |
.h убери в iostream
0 |
8378 / 3600 / 419 Регистрация: 03.07.2009 Сообщений: 10,708 |
|
14.05.2010, 21:22 |
5 |
AKE, в зависимости от того как вы создавали проект, вам может не понадобится std;
0 |
21264 / 8280 / 637 Регистрация: 30.03.2009 Сообщений: 22,635 Записей в блоге: 30 |
|
15.05.2010, 08:47 |
6 |
error C2871: ‘std’ : does not exist or is not a namespace namespace std появилось только в более поздних версиях стандарта Си++ и предназначен для того, чтобы втащить в него всё то, что описано в стандарте Си++ (чтобы проще было отделять мух от котлет). А в старых версиях стандарта (и, соответственно, в старых версиях компиляторах) этого namespace’а не было вообще. К тому же раньше все заголовочные файлы от стандартных библиотек Си++ имели расширение .h: т.е. нужно было писать, например, #include <iostream.h>. В новых стандартах вся стандартная поддержка языка Си++ описана в заголовочных файлах без расширений: т.е. теперь надо писать #include <iostream>, но потом добавлять using namespace std; (либо ко всем глобалам обращаться через std, типа std::cout). Большинство современных компиляторов для совместимости поддерживают в том числе и старый вариант. Но в старых компиляторах нового варианта нет (потому что в те времена его ещё не изобрели). Поэтому в твоём случае нужно просто удалить строку «using namespace std;» (поскольку ты использовал файл с расширением .h). Либо все подключаемые файлы стандартной библиотеки Си++ должны быть без .h (в твоём случае вместо iostream.h должно быть iostream)
2 |
Заблокирован |
|
05.01.2012, 23:17 |
7 |
Evg, чисто для себя хочу узнать — здесь на форуме часто вижу std::cout и т.д.(и все с пеной у рта утверждают что без std:: не по стандарту)
0 |
3211 / 1459 / 73 Регистрация: 09.08.2009 Сообщений: 3,441 Записей в блоге: 2 |
|
05.01.2012, 23:37 |
8 |
-=ЮрА=-, раскрытие пространства имен, весьма опасная привычка. это годится для хеловордов, или же для программ не использующих ничего кроме стандартной библиотеки.
0 |
21264 / 8280 / 637 Регистрация: 30.03.2009 Сообщений: 22,635 Записей в блоге: 30 |
|
06.01.2012, 00:28 |
9 |
-=ЮрА=-, ну, например, ты можешь написать проект с 100500 функциями и называть их «a», «b», «c», … — это будет по стандарту, но затруднит тебе жизнь. С std:: то же самое. Если это «домашняя» программа на два экрана — то проще using использовать, в противном случае лучше std::. Да и вообще лучше заранее приучать себя к тому, что является «правильным» в случаях, когда большой проект пишут несколько людей
1 |
Gepar 1186 / 542 / 78 Регистрация: 01.07.2009 Сообщений: 3,517 |
||||||||
06.01.2012, 00:45 |
10 |
|||||||
AKE, дело в том что написав
в вашем случае пользы не принесёт, проект и с ней должен нормально компилироваться, что и происходит в minigw, но почему-то не происходит в vs 6.0 (сам вот тоже проверил из интереса).
то тогда конфликтов у vs с пространствами имён не возникает так что либо пишите так либо не пишите using namespace std раз уж таким образом подключили нужные вам библиотеки.
0 |
21264 / 8280 / 637 Регистрация: 30.03.2009 Сообщений: 22,635 Записей в блоге: 30 |
|
06.01.2012, 01:01 |
11 |
Для полноты картину ещё и сюда ссылку закину: include <?> для cout
0 |
бжни 2473 / 1684 / 135 Регистрация: 14.05.2009 Сообщений: 7,162 |
|
09.01.2012, 14:52 |
12 |
вообще это вопрос холивара, а не языка
0 |
0 / 0 / 0 Регистрация: 26.09.2012 Сообщений: 38 |
|
11.11.2012, 23:38 |
13 |
-=ЮрА=-, ну, например, ты можешь написать проект с 100500 функциями и называть их «a», «b», «c», … — это будет по стандарту, но затруднит тебе жизнь. С std:: то же самое. Если это «домашняя» программа на два экрана — то проще using использовать, в противном случае лучше std::. Да и вообще лучше заранее приучать себя к тому, что является «правильным» в случаях, когда большой проект пишут несколько людей Можно пример (желательно для новичка) в котором using namespace std; может повредить программе ?
0 |
бжни 2473 / 1684 / 135 Регистрация: 14.05.2009 Сообщений: 7,162 |
|
11.11.2012, 23:56 |
14 |
Можно пример (желательно для новичка) в котором using namespace std; может повредить программе ? LinkedList list;
0 |
Croessmah Don’t worry, be happy 17781 / 10545 / 2036 Регистрация: 27.09.2012 Сообщений: 26,517 Записей в блоге: 1 |
||||
12.11.2012, 00:01 |
15 |
|||
может повредить программе ? как вариант:
0 |
0 / 0 / 0 Регистрация: 26.09.2012 Сообщений: 38 |
|
12.11.2012, 00:53 |
16 |
CroessmahПоясните, что здесь не верно ? К nothrow будет применяться std ?
0 |
424 / 389 / 113 Регистрация: 21.09.2012 Сообщений: 913 |
|
12.11.2012, 01:07 |
17 |
Переменная nothrow уже есть в std:: const std::nothrow_t std::nothrow Миниатюры
0 |
0 / 0 / 0 Регистрация: 26.09.2012 Сообщений: 38 |
|
12.11.2012, 01:10 |
18 |
Благодарю за пояснение.
0 |
- Forum
- General C++ Programming
- error with using namespace std
error with using namespace std
the program runs well for this header file.
#pragma once
#include»birthday.h»
#include<string>
using namespace std;
class people
{
public:
people(string yourName, birthday DOB);
void printInfo();
private:
string name;
birthday dobObject;
};
but
by removing using namespace std; the programs fails with error. can you please give me the reason and elaborate?
#pragma once
#include»birthday.h»
#include<string>
class people
{
public:
people(string yourName, birthday DOB);
void printInfo();
private:
string name;
birthday dobObject;
};
Last edited on
1. Avoid
using namespace std;
at global scope in a header file.
2. In the header, use qualified names for entities from the standard library
|
|
#pragma once
class birthday
{
public:
birthday(int m, int d , int );
void printOutDOB();
private:
int day;
int month;
int year;
};
excuse me sir, but for above header file «bithday.h» i didn’t have to use qualified names for int. is there some rules for that in documentation or what? can you elaborate it?
1) Please use code tags when posting code, to make it readable:
http://www.cplusplus.com/articles/z13hAqkS/
2) There’s nothing in the header file that needs a std::
qualification, but there are things in your source file. Since there’s no longer a using namespace std;
statement anywhere in the translation unit, you’ll need to qualify those names in the source file.
Last edited on
by removing using namespace std; the programs fails with error.
You do mean that the compiler aborts and gives error messages.
It is not enough to merely note that there is «an error». You have to read the error messages carefully, because they tell what offends the compiler.
For example,
|
|
Produces on one compiler:
6:24: error: expected ')' before 'yourName' 11:9: error: 'string' does not name a type
and in another:
main.cpp:6:24: error: expected ')' before 'yourName' people( string yourName, int DOB ); ^ main.cpp:11:9: error: 'string' does not name a type string name; ^
Both clearly point to lines 6 and 11.
Line 11 is quite clear; the compiler understands that ‘string’ should probably be a name of a type, but compiler has not seen definition of such type. You do include <string> and it does contain definition of ‘string’, but that definition is within namespace ‘std’ and the compiler does not see inside namespaces unless it is told to look there.
Both using namespace std;
and using std::string;
essentially state that when looking for ‘string’, a ‘string’ inside ‘std’ is a match too.
std::string
in code is more explicit: only the ‘string’ in ‘std’ is a match.
What is before ‘yourName’ on line 6? people( string
This message is harder to explain.
We can try to humor the compiler and test what happens if we write line 6 as:
people( string );
Alas, that gives a different error:
6:24: error: field 'string' has incomplete type 'people'
The important thing is to read those error messages and use the info the best you can.
For example, when asking for help do show the exact messages. Someone might be able to help you read them.
clang++ emits a very clear diagnostic.
MinGW64 6:38am /r/code/test >CC --version clang version 5.0.1 (tags/RELEASE_501/final) Target: x86_64-w64-windows-gnu Thread model: posix InstalledDir: C:msys64mingw64bin MinGW64 6:38am /r/code/test >CC -c test.cpp test.cpp:6:17: error: unknown type name 'string'; did you mean 'std::string'? people( string yourName, int DOB ); ^~~~~~ std::string C:msys64mingw64includec++7.3.0bits/stringfwd.h:74:33: note: 'std::string' declared here typedef basic_string<char> string; ^ test.cpp:11:9: error: unknown type name 'string'; did you mean 'std::string'? string name; ^~~~~~ std::string C:msys64mingw64includec++7.3.0bits/stringfwd.h:74:33: note: 'std::string' declared here typedef basic_string<char> string; ^ 2 errors generated.
Topic archived. No new replies allowed.
Содержание
- Using namespace std declaration syntax error
- Using namespace std declaration syntax error
- Using namespace std declaration syntax error
- Using namespace std declaration syntax error
Using namespace std declaration syntax error
всем здрасте.
предыстория
Решил самостоятельно С НУЛЯ изучить с++ по самоучителю «С++ без страха» Б. Оверленд 2005г.
Код пишу в «Borland C++ v 4.5»
Microsoft Visual C++ или Borland C++ Builder планирую начать использовать позже, когда появятся навык написания кода в простой среде разработки. чтоб ошибки программирования не путались с ошибками использования среды разработки. )) за это прошу не критиковать.
это была предыстория вопроса
вот код программы
вопрос 1.
using namespace std
в книгах настоятельно рекомендуют вставлять в программу эту строку. Пишут что using позволяет обращаться к обьектам например std::cout напрямую.
у меня в коде эта строка закомментирована потому что с ней не проходит компиляция. Пишет ошибка: «Declaration syntax error».
если закомментировать, то все работет нормально. при этом я же не прописываю вывод на экран std::cout хотя по книжке я именно так должен был сделать т.к. не прописал using?
в чем проблемма?
вопрос 2.
код тот же. У меня написано «iostream.h». А в книге говорят что надо писать без «*.h «, а без такого окончания опять не проходит компиляция. пишет что не может открыть файл iostream
в чем проблемма?
вопрос 3.
Еще проблемма с выводом русских букв на экран. Типа «cout
ответ 1
если используешь std, то нужно подключать не #include , а #include . И вобще, эту привычку, в std-ных инклудах .h добавлять лучше не заводить
ответ 2
а вот это не знаю. у меня при #include прекрасно все работает.
хотя «Borland C++ v 4.5» у меня вызыват подозрения. ОЧЕНЬ старый, с тех пор компиляторы хорошо поменялись. лучше уж на VC 6.0 или билдере начиная с 6го пиши
ответ 3.
мой совет — пиши на инглише или транслитом.
но если хочется, то в свойствах компилятора это было, но не помню, где.
может кто другой ответит
Источник
Using namespace std declaration syntax error
всем здрасте.
предыстория
Решил самостоятельно С НУЛЯ изучить с++ по самоучителю «С++ без страха» Б. Оверленд 2005г.
Код пишу в «Borland C++ v 4.5»
Microsoft Visual C++ или Borland C++ Builder планирую начать использовать позже, когда появятся навык написания кода в простой среде разработки. чтоб ошибки программирования не путались с ошибками использования среды разработки. )) за это прошу не критиковать.
это была предыстория вопроса
вот код программы
вопрос 1.
using namespace std
в книгах настоятельно рекомендуют вставлять в программу эту строку. Пишут что using позволяет обращаться к обьектам например std::cout напрямую.
у меня в коде эта строка закомментирована потому что с ней не проходит компиляция. Пишет ошибка: «Declaration syntax error».
если закомментировать, то все работет нормально. при этом я же не прописываю вывод на экран std::cout хотя по книжке я именно так должен был сделать т.к. не прописал using?
в чем проблемма?
вопрос 2.
код тот же. У меня написано «iostream.h». А в книге говорят что надо писать без «*.h «, а без такого окончания опять не проходит компиляция. пишет что не может открыть файл iostream
в чем проблемма?
вопрос 3.
Еще проблемма с выводом русских букв на экран. Типа «cout
ответ 1
если используешь std, то нужно подключать не #include , а #include . И вобще, эту привычку, в std-ных инклудах .h добавлять лучше не заводить
ответ 2
а вот это не знаю. у меня при #include прекрасно все работает.
хотя «Borland C++ v 4.5» у меня вызыват подозрения. ОЧЕНЬ старый, с тех пор компиляторы хорошо поменялись. лучше уж на VC 6.0 или билдере начиная с 6го пиши
ответ 3.
мой совет — пиши на инглише или транслитом.
но если хочется, то в свойствах компилятора это было, но не помню, где.
может кто другой ответит
Источник
Using namespace std declaration syntax error
всем здрасте.
предыстория
Решил самостоятельно С НУЛЯ изучить с++ по самоучителю «С++ без страха» Б. Оверленд 2005г.
Код пишу в «Borland C++ v 4.5»
Microsoft Visual C++ или Borland C++ Builder планирую начать использовать позже, когда появятся навык написания кода в простой среде разработки. чтоб ошибки программирования не путались с ошибками использования среды разработки. )) за это прошу не критиковать.
это была предыстория вопроса
вот код программы
вопрос 1.
using namespace std
в книгах настоятельно рекомендуют вставлять в программу эту строку. Пишут что using позволяет обращаться к обьектам например std::cout напрямую.
у меня в коде эта строка закомментирована потому что с ней не проходит компиляция. Пишет ошибка: «Declaration syntax error».
если закомментировать, то все работет нормально. при этом я же не прописываю вывод на экран std::cout хотя по книжке я именно так должен был сделать т.к. не прописал using?
в чем проблемма?
вопрос 2.
код тот же. У меня написано «iostream.h». А в книге говорят что надо писать без «*.h «, а без такого окончания опять не проходит компиляция. пишет что не может открыть файл iostream
в чем проблемма?
вопрос 3.
Еще проблемма с выводом русских букв на экран. Типа «cout
ответ 1
если используешь std, то нужно подключать не #include , а #include . И вобще, эту привычку, в std-ных инклудах .h добавлять лучше не заводить
ответ 2
а вот это не знаю. у меня при #include прекрасно все работает.
хотя «Borland C++ v 4.5» у меня вызыват подозрения. ОЧЕНЬ старый, с тех пор компиляторы хорошо поменялись. лучше уж на VC 6.0 или билдере начиная с 6го пиши
ответ 3.
мой совет — пиши на инглише или транслитом.
но если хочется, то в свойствах компилятора это было, но не помню, где.
может кто другой ответит
Источник
Using namespace std declaration syntax error
Профиль
Группа: Участник
Сообщений: 4
Регистрация: 9.10.2007
Репутация: нет
Всего: нет
Решил самостоятельно С НУЛЯ изучить с++ по самоучителю «С++ без страха» Б. Оверленд 2005г.
Код пишу в «Borland C++ v 4.5»
Microsoft Visual C++ или Borland C++ Builder планирую начать использовать позже, когда появятся навык написания кода в простой среде разработки. чтоб ошибки программирования не путались с ошибками использования среды разработки. )) за это прошу не критиковать.
это была предыстория вопроса 😉
вот код программы
chelser |
|
||
Код |
#include //using namespace std; |
int main() <
cout
using namespace std
в книгах настоятельно рекомендуют вставлять в программу эту строку. Пишут что using позволяет обращаться к обьектам например std::cout напрямую.
у меня в коде эта строка закомментирована потому что с ней не проходит компиляция. Пишет ошибка: «Declaration syntax error».
если закомментировать, то все работет нормально. при этом я же не прописываю вывод на экран std::cout хотя по книжке я именно так должен был сделать т.к. не прописал using?
в чем проблемма?
код тот же. У меня написано «iostream.h». А в книге говорят что надо писать без «*.h «, а без такого окончания опять не проходит компиляция. пишет что не может открыть файл iostream
в чем проблемма?
Еще проблемма с выводом русских букв на экран. Типа «cout
|
(нет голосов)
Загрузка .
Эксперт
Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва
Репутация: 51
Всего: 70
Цитата(chelser @ 10.10.2007, 13:59 |
у меня в коде эта строка закомментирована потому что с ней не проходит компиляция. Пишет ошибка: «Declaration syntax error». |
если закомментировать, то все работет нормально. при этом я же не прописываю вывод на экран std::cout хотя по книжке я именно так должен был сделать т.к. не прописал using?
в чем проблемма?
Цитата(chelser @ 10.10.2007, 13:59 |
Код пишу в «Borland C++ v 4.5» |
Microsoft Visual C++ или Borland C++ Builder планирую начать использовать позже, когда появятся навык написания кода в простой среде разработки. чтоб ошибки программирования не путались с ошибками использования среды разработки. )) за это прошу не критиковать.
Цитата(chelser @ 10.10.2007, 13:59 |
в книгах настоятельно рекомендуют вставлять в программу эту строку. Пишут что using позволяет обращаться к обьектам например std::cout напрямую. |
Цитата(chelser @ 10.10.2007, 13:59 |
код тот же. У меня написано «iostream.h». А в книге говорят что надо писать без «*.h «, а без такого окончания опять не проходит компиляция. пишет что не может открыть файл iostream |
в чем проблемма?
Цитата(chelser @ 10.10.2007, 13:59 |
|
Еще проблемма с выводом русских букв на экран. Типа «cout |
|
трололомен
Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур
Репутация: 2
Всего: 306
Код |
#include using namespace std; |
int main() <
cout
а что бы русский шрифт в консоли работал номано юзай chelser функцию CharToOem
Это сообщение отредактировал(а) mrbrooks — 10.10.2007, 13:43
akizelokro |
|
||
Крокодил Профиль Репутация: 1
Borland C++ был выпущен в 1994 году. STL была включена в стандарт С++ весной 1994 года. Трудно требовать от компилятора полной поддержки стандарта, если компилятор писался во время или сразу после «по горячим следам» изменений стандарта. Но если ты собираешься изучать стандарт, то как начинающий начинающему посоветую поменять компилятор на более свежий. |
|||
|
Daevaorn |
|
||
Эксперт Профиль Репутация: 51
|
|||
|
mrbrooks |
|
||
трололомен Профиль Репутация: 2 |
|||
|
Эксперт
Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев
Репутация: 21
Всего: 25
Daevaorn, ты и сам ВСЕГДА пишешь std:: перед стандартными функциями?
тут же речь о мелких прогах идет, тут еще можно.
главное, не зацикливаться, ибо в больших проектах, согласен, std:: писать надо.
Alek86 |
|
||
|
Daevaorn |
|
|||
Эксперт Профиль Репутация: 51
|
||||
|
SergeCpp |
|
||
Профиль Репутация: 15 Удивительно (и очень часто встречаю) — неужели является секретом имя автора C++? Почему изучение начинается с книг весьма и весьма экстравагантных. Почему бы не приобрести оригинал. Слухи о трудности книги Страуструпа (если они повлияли на выбор) — весьма преувеличены |
|||
|
Greeen |
|
||
Опытный Профиль Репутация: 7 |
|||
|
Профиль
Группа: Участник
Сообщений: 4
Регистрация: 9.10.2007
Репутация: нет
Всего: нет
chelser |
|
||
Цитата |
SergeCpp, поддерживаю. Иногда диву даешься сколько всякий «С++ без проблем», «С++ бархатный путь» и еще всяких извращений на полках книжных магазинов. А реально стоящих книг раз-два и все. |
Не совсем с вами согласен. Книги на которые вы ссылаетесь не спрю лучше, но информация в них преподносится так будто ее читающий минимум чемпион мира по программированию. Чайнику в данном вопросе очень трудно понять изложенную информацию. Выбор данной книги обусловлен исключительно вышеизложенным. Конечно после того как войду в курс дела воспользуюсь более серьезной литературой.
Добавлено через 3 минуты и 21 секунду
т.е. насколько я понял, то все мои вопросы сходятся к тому что я использую устаревший компилятор?
Добавлено через 6 минут и 45 секунд
Цитата |
то как начинающий начинающему посоветую поменять компилятор на более свежий. |
SergeCpp |
|
||
Профиль Репутация: 15
Я был чайником в данном вопросе (C++) Взял и прочитал дома, тихо, спокойно, 1-е издание (самое старое) — полностью всё Потом купил 2-е издание (в двух томах), таким же образом прочёл его — полностью всё Сложностей при чтении особых не встретил Интернетов с форумами не было да и незачем это (думать самому нужно) |
|||
|
Daevaorn |
|
|||||
Эксперт Профиль Репутация: 51
|
||||||
|
Профиль
Группа: Участник
Сообщений: 4
Регистрация: 9.10.2007
Репутация: нет
Всего: нет
chelser |
|
||
|
archimed7592 |
|
|||
Архимед Профиль Репутация: 58
Я вот всегда пишу — у меня это уже рефлекс. Даже в форумах, 2-3 строчные примеры пишу с std.
|
||||
|
akizelokro |
|
||
Крокодил Профиль Репутация: 1
|
|||
|
archimed7592 |
|
|||
Архимед Профиль Репутация: 58
Некоторые руководства, думаю, расчитанные не на новичка, которые редко знают о возможности ограничить scope или не догадываются, что если и советуют писать using blablabla , то ни в коем случае не в заголовочном файле и т.д.
|
||||
|
Dronchik |
|
||
Звукач ёмаё Профиль Репутация: 0
char qwerty[10]; |
Добавлено через 3 минуты и 3 секунды
Локаль жрёт меньше ресурсов
Вместо слов делай дело, от которого ты фанатеешь. (с)
zkv |
|
|||||
Профиль Репутация: 26
|
||||||
|
akizelokro |
|
|||||
Крокодил Профиль Репутация: 1
Аргумент небезупречен. Что-то я не встречал «Не пишите никогда using namespace std; а потом просто cout — это плохо, пишите только std::cout — это хорошо».
это аргумент. Но у меня, новичка, не возникло бы никаких вопросов, если бы в начала цитаты не было бы слов «по возможности».
Прочитал. Более-менее серьезные аргументы в том, что не «засоряется» (кавычки мои) глобальное пространство имен и ускоряется компиляция. Про время компиляции, — поверю. По слову «засоряется», я все-таки поверю штатским тестовым сайтам, как они будут оформлять задачи по стандартной библиотке, которую эксперт должен знать наизусть. Давайте, предупреждение у меня уже есть. Модерируйте. |
||||||
|
archimed7592 |
|
||
Архимед Профиль Репутация: 58
В задачках как правило используется не самый лучший стиль. Цель задачи описать проблему наиболее кратко и получить ответ на вопрос «умеет ли соискатель решать такого рода проблемы?». Засоряется оно очень даже хорошо. Не раз сталкивался. |
|||
|
Mal Hack |
|
||
Мудрый. Профиль Репутация: 2 Я проше прощения за поднятие старой темы, но вопрос по сабжу. |
|||
|
Lazin |
|
||
Эксперт Профиль Репутация: 41 |
|||
|
Эксперт
Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008
Репутация: 11
Всего: 36
Rififi |
|
||
Цитата(chelser @ 10.10.2007, 12:59 |
в книгах настоятельно рекомендуют вставлять в программу эту строку. Пишут что using позволяет обращаться к обьектам например std::cout напрямую. |
Mal Hack |
|
||
Мудрый. Профиль Репутация: 2 |
|||
|
Ulysses4j |
|
||
Опытный Профиль Репутация: 4
Простите, позволю себе также ответить на поставленный вопрос: Герберт Шилдт — ламер. Последний перл: этот человек во вступлении к книжке по последней Java (6-ой, значится) все еще рассуждает на тему, является ли Java япом для интернета. Откопал экскременты мамонта, называется. По сабжу: разницы нет. Все обращения, которые разнятся наличием квалификации пространства имен, связываются с объектами этих пространств имен на этапе компиляции. Упрощенно ситуацию можно представить так: на месте обращения к cout (квалифицированного или нет) компилятор вписывает адрес объекта. Пространства имен позволяют помочь компилятору понять, какой именно адрес написать (если имен cout несколько в разных пространствах имен). Как именно cout приписано к пространству имен (using или std::cout) компилятору неважно, лишь бы конфликтов не было. Он впишет нужный адрес и точка. По сабжу выше: писать директивы включения пространст имен (using namespace . ) это nasty. Плохо, типа. В стендовых примерах можно. Ну, в тестовых рутинах, если очень уж неймется, с натяжкой. Но в продакш коде («библиотечном коде») никогда. Это сообщение отредактировал(а) Ulysses4j — 11.7.2008, 05:29 |
|||
|
JackYF |
|
||
полуавантюрист Профиль Репутация: 18 |
|||
|
Henpyxa |
|
||
Профиль Репутация: нет почитал, поржал.. и так и не дали вразумительного ответа, хорошо или плохо писать в начале кода using namespace блаблабла; |
|||
|
любитель
Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006
Репутация: 144
Всего: 250
Henpyxa, если приблизить к Вашему стилюм, то вот так себя чувствует компилятор:
берет cout , думает кто ж это такой, благо находит подходящий только в std:: и успокаивается, значит это он.
берет cin, думает кто ж такой? находит один в std:: и один в anynamespace:: и озадачивает себя и программиста вопросом, а кой же использовать ?!
берет std::cin и без всяких раздумий использует его
mes |
|
||
|
azesmcar |
|
|||
uploading. Профиль Репутация: 81
А ты Саттера попробуй
Его нет, это вопрос предпочтений. Что точно можно сказать так это то, что в заголовочных файлах using писать НЕ хорошо, а в cpp пиши если хочешь. Как будет удобно. |
||||
|
boostcoder |
|
||
pattern`щик Профиль Репутация: 49 особенно весело бывает когда раскрываешь несколько namespace`ов, к примеру std, boost, boost::asio, boost::asio::ip::tcp. вот тогда-то и начинается все веселье Это сообщение отредактировал(а) boostcoder — 9.10.2010, 14:17 |
|||
|
Шустрый
Профиль
Группа: Участник
Сообщений: 89
Регистрация: 22.8.2007
Репутация: 2
Всего: 2
я всегда пишу в заголовке using std::something.
или если тип внутри класса юзается определяю новое имя через typedef
typedef std::Something _tSomething;
и дальше в коде использую Something.
Мне кажется в коде каждый раз писать namespace name тоже не очень кашерно. Для std::cout ещё ничего смотрится, но если там вложенные namespace-ы? например boost::unit_test::something — мне что каждый раз тятнуть за собой эту тягомотину?
но одно верно «using namespace std» — это зло.
Master01 |
|
||
|
azesmcar |
|
||
uploading. Профиль Репутация: 81
Это сообщение отредактировал(а) azesmcar — 9.10.2010, 14:20 |
|||
|
boostcoder |
|
|||
pattern`щик Профиль Репутация: 49
|
||||
|
любитель
Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006
Репутация: 144
Всего: 250
mes |
|
||
Цитата(azesmcar @ 9.10.2010, 13:15 |
что в заголовочных файлах using писать НЕ хорошо, а в cpp пиши если хочешь. Как будет удобно. |
дело даже не в заголовочных файлах а в области видимости..
в общем надо делать так чтоб «других» твои раскрытия видимости не коснулись..
«других» это не людей, а фрагментов кодов имеющих свою логику.. они могут быть как в одном файле , так и в разных..
Шустрый
Профиль
Группа: Участник
Сообщений: 89
Регистрация: 22.8.2007
Репутация: 2
Всего: 2
Master01 |
|
||
Цитата(Master01 @ 9.10.2010, 14:17 |
но одно верно «using namespace std» — это зло. |
azesmcar, наверно, я всё же слишком безапеляционно высказался насчёт «using namespace std.»
Мне почему-то кажется, что вы готовы из рукава вытащить тройку-другую контраргументов для меня которые, в свою очередь, также можно контраргументировать .
Правельнее было бы сказать, что Я предпочитаю такой подход не использовать, однако, не настаиваю, что моё мнение единственно правельное.
Однако, по вашему вопросу — я так не пишу из 2х соображений:
1. Не очень будет приятно если что-то из std или из другого «густонаселённого» namespace-а начнёт конфликтовать с чем-то таким же загадочным из другого namespace-а.
2. Так более понятно какой именно функционал из какого namespace-а используется в данном модуле.
Добавлено через 11 минут и 46 секунд
Цитата(boostcoder @ 9.10.2010, 14:19) |
Цитата(Master01 @ 9.10.2010, 14:17 |
boost::unit_test::something — мне что каждый раз тятнуть за собой эту тягомотину? |
Код |
namespace but = boost::unit_test; . but::something |
boostcoder, спасибо. Интересный вариант.
Единственное, что меня смущает это не запутается ли, читающий код человек, в таком лабиринте namespace-ов?
Просто, все знают что такое boost::unit_test, а вот but придётся поискать определние. Если предположить что таких «петель» много, то можно основательно запутаться, наверно . хотя, так во всём, если подходить к проблеме бездумно.
Henpyxa |
|
|||
Профиль Репутация: нет
я не знаю что это такое к слову сказать, а где можно посмотреть-поизучать внутренности нэймспэйсов? а насчет книги.. заметил где-то на форуме сообщение про http://worldcpp.vingrad.ru/, почитал, понравилось хотя материала и много, но все же маловато для полного понимания азов. хотя бы про классы в С++: пытался написать простенькую программку, используя знания, полученные от чтения фака, что-то типа
int main() |
и не вкурю никак про ошибку Run-Time Check Failure #3 — The variable ‘iSellPrice’ is being used without being defined. недостаточно там написано про классы и в шапке все-таки использовал using namespace std;
имхо, удобней указать один раз в маленьком коде, чем каждый раз втыкать перед cout’ами и cin’ами. про длинные коды даже страшно думать..
Crafty |
|
|||
Опытный Профиль Репутация: 2 Добавлено через 4 минуты и 56 секунд
Это сообщение отредактировал(а) Crafty — 9.10.2010, 17:35 |
||||
|
boostcoder |
|
|||
pattern`щик Профиль Репутация: 49
|
||||
|
azesmcar |
|
|||
uploading. Профиль Репутация: 81
Да нет, для этого аргументов не нужно. Аргументы нужны для обоснования того, что using namespace — зло
|
||||
|
любитель
Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006
Репутация: 144
Всего: 250
mes |
|
||
Цитата(Henpyxa @ 9.10.2010, 15:56 |
удобней указать один раз в маленьком коде, |
в маленьком учебном или «для себя» коде можно вообще писать как угодно..
а вот если проект чуть побольше, то зачем создавать потенциальные проблемы,
если с cout и cin достаточно уникальны и проблем не будет, но вот тот же vector есть в куче разных библиотек..
и мало того что раскрытые имена могут создать неопределенность для компилятора, так и программисту с ходу не сразу будет понятно о чем речь..
Цитата(Henpyxa @ 9.10.2010, 15:56 |
чем каждый раз втыкать |
вспомните народную мудрость «подальше положишь — поближе возьмешь».
Цитата(Master01 @ 9.10.2010, 15:25 |
вот but придётся поискать определние. |
используемые синонимы неймспейсов легче запомнить, раз два и обчелся, чем уследить за всеми сущностями раскрытых пространств..
вобщем найдите хороший компромис, и код будет красивым и удобным
bsa |
|
||
Эксперт Профиль Репутация: 63
На самом деле, в случае использования using namespace произойдет следующее: взяли пару стеллажей (количество пространств + глобальное + локальное) и вывалили все его содержимое в кучу, затем сказали компилятору, а нука найди мне cout в этой кучи. Лично я считаю, что using namespace: |
|||
|
любитель
Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006
Репутация: 144
Всего: 250
mes |
|
||
Цитата(bsa @ 10.10.2010, 10:28 |
взяли пару стеллажей (количество пространств + глобальное + локальное) и вывалили все его содержимое в кучу, затем сказали компилятору, а нука найди мне cout в этой кучи. |
добавлю (хотя и было уже сказано) что если компилятору все равно в какой кучи искать, то программисту уследить за всеми связями в такой неразбирихи довольно сложно..
Henpyxa |
|
||
Профиль Репутация: нет
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn
[ Время генерации скрипта: 0.2951 ] [ Использовано запросов: 21 ] [ GZIP включён ] Источник Читайте также: Operation upload firmware error 113 pandora Adblock |
ProgrammerAH
Programmer Guide, Tips and Tutorial
Leave a reply
Error: main.cpp: warning: using directive refers to implicitly-defined namespace ‘std’
If you see the following error when trying to compile a C++ application:
main.cpp: : : warning: using directive refers to implicitly-defined namespace 'std'
then that means you do not have any header file inclusion that uses std namespace.
You can fix this warning by including a C++ header file that uses a std namespace otherwise the compile will not know about std namespace.
How to Solve this Error:
Very simple, just include a c++ header file, as follows:
#include <iostream>
Read More:
- A mistake about implicitly providing default constructors
- [Solved] The method getContextPath() from the type HttpServletRequest refers to the missing type String
- [Solved] The type or namespace name ‘Service’ does not exist Error
- .NETproject compilation error. Type or namespace name could not be found. Visual studio automatically introduces dependency package (shortcut key)
- [Solved] keil arm_math Error: error: #35: #error directive: “Define according the used Cortex cor
- [Solved] STM8L151 IAR Project Compile Error: Fatal Error[Pe035]: #error directive: “Please select first the target STM8L…
- [Solved] Error: ‘attrition‘ is not an exported object from ‘namespace:rsample‘
- [Solved] Error: package or namespace load failed for ‘ggplot2’ in loadNamespace(i, c(lib.loc, .libPaths()), v
- [Solved] kubelet Startup Error: cannot find network namespace for the terminated container
- How to Fix the common Warning Errors after Vue Project Startup
- [Go] Testing when solving go test: warning: no tests to run
- How to Solve jQuery error: Uncaught ReferenceError: $ is not defined
- [Solved] lua error: no resolver defined to resolve
- Vue3 Warning: [Vue warn]: Extraneous non-emits event listeners (changeParentProps) were passed to component
- How to Solve SSH Login Error: WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
- [Solved] Vue Error: Failed to mount component: template or render function not defined
- [Solved] PCH Warning: header stop not at file scope
- ROS Gazabo Error: [ERROR]: No p gain specified for pid. Namespace: /gazebo_ros_control/pid_gains/ ×65374;
- The browser is compatible with IE11 “ReferenceError: ‘Promise’ is not defined” “ReferenceError: ‘Promise’ is not defined”
- Ant Design Vue-Table Error: warning.js?2149:7 [How to Solve]
Leave a Reply
Your email address will not be published. Required fields are marked *
Comment *
Name *
Email *
Website
Save my name, email, and website in this browser for the next time I comment.
Время прочтения
3 мин
Просмотры 37K
То, что написано ниже, для многих квалифицированных C++ разработчиков будет прекрасно известным и очевидным, но тем не менее, я периодически встречаю using namespace std; в коде различных проектов, а недавно в нашумевшей статье про впечатления от высшего образования было упомянуто, что студентов так учат писать код в вузах, что и сподвигло меня написать эту заметку.
Итак… многие слышали, что using namespace std; в начале файла в C++ считается плохой практикой и нередко даже явно запрещен в принятых во многих проектах стандартах кодирования. Касательно недопустимости использования using namespace в header-файлах вопросов обычно не возникает, если мы хоть немного понимаем, как работает препроцессор компилятора: .hpp-файлы при использовании директивы #include вставляются в код «как есть», и соответственно using автоматически распространится на все затронутые .hpp- и .cpp-файлы, если файл с ним был заинклюден хоть в одном звене цепочки (на одном из сайтов это метко обозвали «заболеванием передающимся половым путем«). Но вот про .cpp-файлы все не так очевидно, так что давайте еще раз разберем, что же именно здесь не так.
Для чего вообще придумали пространства имен в C++? Когда какие-то две сущности (типы, функции, и т.д.) имеют идентификаторы, которые могут конфликтовать друг с другом при совместном использовании, C++ позволяет объявлять пространства с помощью ключевого слова namespace. Всё, что объявлено внутри пространства имен, принадлежит только этому пространству имен (а не глобальному). Используя using мы вытаскиваем сущности какого-либо пространства имен в глобальный контекст.
А теперь посмотрим, к чему это может привести.
Допустим, вы используете две библиотеки под названием Foo и Bar и написали в начале файла что-то типа
using namespace foo;
using namespace bar;
…таким образом вытащив всё, что есть в foo:: и в bar:: в глобальное пространство имен.
Все работает нормально, и вы можете без проблем вызвать Blah() из Foo и Quux() из Bar. Но однажды вы обновляете библиотеку Foo до новой версии Foo 2.0, которая теперь еще имеет в себе функцию Quux().
Теперь у вас конфликт: и Foo 2.0, и Bar импортируют Quux() в ваше глобальное пространство имен. В лучшем случае это вызовет ошибку на этапе компиляции, и исправление этого потребует усилий и времени.
А вот если бы вы явно указывали в коде метод с его пространством имен, а именно, foo::Blah() и bar::Quux(), то добавление foo::Quux() не было бы проблемой.
Но всё может быть даже хуже!
В библиотеку Foo 2.0 могла быть добавлена функция foo::Quux(), про которую компилятор по ряду причин посчитает, что она однозначно лучше подходит для некоторых ваших вызовов Quux(), чем bar::Quux(), вызывавшаяся в вашем коде на протяжении многих лет. Тогда ваш код все равно скомпилируется, но будет молча вызывать неправильную функцию и делать бог весть что. И это может привести к куче неожиданных и сложноотлаживающихся ошибок.
Имейте в виду, что пространство имен std:: имеет множество идентификаторов, многие из которых являются очень распространенными (list, sort, string, iterator, swap), которые, скорее всего, могут появиться и в другом коде, либо наоборот, в следущей версии стандарта C++ в std добавят что-то, что совпадет с каким-то из идентификаторов в вашем существующем коде.
Если вы считаете это маловероятным, то посмотрим на реальные примеры со stackoverflow:
-
Вот тут был задан вопрос о том, почему код возвращает совершенно не те результаты, что от него ожидает разработчик. По факту там происходит именно описанное выше: разработчик передает в функцию аргументы неправильного типа, но это не вызывает ошибку компиляции, а компилятор просто молча использует вместо объявленной выше функции distance() библиотечную функцию std::distance() из std:: ставшего глобальным неймспейсом.
-
Второй пример на ту же тему: вместо функции swap() используется std::swap(). Опять же, никакой ошибки компиляции, а просто неправильный результат работы.
Так что подобное происходит гораздо чаще, чем кажется.
P.S. В комментариях еще была упомянута такая штука, как Argument Dependent Lookup, она же Koenig lookup. Почитать подробнее можно на Википедии, но в итоге лекарство от этой проблемы такое же: явное указание пространства имен перед вызовом функций везде, где только можно.
Recommended Answers
Shouldn’t use void main. getch() isn’t a great way of stopping the program. iostream.h is non-standard. use iostream:
#include <iostream> using namespace std; int main( void ) { std::cin.ignore(); return 0; }
Jump to Post
All 4 Replies
15 Years Ago
Shouldn’t use void main. getch() isn’t a great way of stopping the program. iostream.h is non-standard. use iostream:
#include <iostream>
using namespace std;
int main( void ) {
std::cin.ignore();
return 0;
}
Ancient Dragon
5,243
Achieved Level 70
Team Colleague
Featured Poster
15 Years Ago
Hi guys,
i have one question, when i type
using namespace std;
at top of my program my compiler gives some error
especially syntax error!
my compiler is Borland C++ v.5
for example simple code:
When using the old headers with .h extension you don’t use «using namespace std». Check to see if your compiler supports the new headers without an extension and use those instead. The old files are out-of-date and will cause lots of other problems if you attempt to use current coding practices.
15 Years Ago
Shouldn’t use void main. getch() isn’t a great way of stopping the program. iostream.h is non-standard. use iostream:
#include <iostream> using namespace std; int main( void ) { std::cin.ignore(); return 0; }
Thanks, it works, but i dont understand part of your code!
std::cin.ignore()
why you use that?!
my compiler gives error on that line?!, is it for pausing the screen?!
Regards
n.aggel
13
Posting Whiz in Training
15 Years Ago
When using the old headers with .h extension you don’t use «using namespace std». Check to see if your compiler supports the new headers without an extension and use those instead. The old files are out-of-date and will cause lots of other problems if you attempt to use current coding practices.
fzafarani here is some more info on the subject {i found it on the internet!}:
The use of namespace std for all identifiers of the C++ standard library was introduced during
the standardization process. This change is not backward compatible to old header files, in which identifiers of the C++ standard library are declared in the global scope.
In addition, some interfaces of classes changed during the standardization process (however, the goal was to stay backward compatible if possible). So, a new style for the names of standard header files was introduced. This allows vendors to stay backward compatible by providing the old header files.
i got the text from here
Reply to this topic
Be a part of the DaniWeb community
We’re a friendly, industry-focused community of developers, IT pros, digital marketers,
and technology enthusiasts meeting, networking, learning, and sharing knowledge.