Using namespace std error

Возникает ошибка с using namespace std; C++ Решение и ответ на вопрос 129454

AKE

12 / 12 / 3

Регистрация: 09.05.2010

Сообщений: 384

1

14.05.2010, 00:16. Показов 28674. Ответов 17

Метки нет (Все метки)


C++
1
2
3
4
5
6
7
#include "stdio.h"
#include "string.h"
#include "math.h"
#include "stdlib.h"
#include "stdafx.h"
#include "iostream.h"
using namespace std; //здесь ошибка

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



Эксперт JavaЭксперт С++

8378 / 3600 / 419

Регистрация: 03.07.2009

Сообщений: 10,708

14.05.2010, 21:22

5

AKE, в зависимости от того как вы создавали проект, вам может не понадобится std;
MS VC++ 6 позволяет как использовать, так и не использовать std



0



Эксперт CАвтор FAQ

21264 / 8280 / 637

Регистрация: 30.03.2009

Сообщений: 22,635

Записей в блоге: 30

15.05.2010, 08:47

6

Цитата
Сообщение от AKE
Посмотреть сообщение

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



-=ЮрА=-

Заблокирован

Автор FAQ

05.01.2012, 23:17

7

Evg, чисто для себя хочу узнать — здесь на форуме часто вижу std::cout и т.д.(и все с пеной у рта утверждают что без std:: не по стандарту)
В случае если использую только функции std;(обычная консоль) логичней и лаконичней для кода записать using namespace std; под хедерами и не загромождать код std:: или я не прав???



0



Эксперт С++

3211 / 1459 / 73

Регистрация: 09.08.2009

Сообщений: 3,441

Записей в блоге: 2

05.01.2012, 23:37

8

-=ЮрА=-, раскрытие пространства имен, весьма опасная привычка. это годится для хеловордов, или же для программ не использующих ничего кроме стандартной библиотеки.



0



Эксперт CАвтор FAQ

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, дело в том что написав
include «iostream.h» Вы уже подключили iostream с указанием что потоки cin, cout а также манипуляторы вроде endl принадлежат пространству имён std, тем не менее хотя строка

C++
1
using namespace std;

в вашем случае пользы не принесёт, проект и с ней должен нормально компилироваться, что и происходит в minigw, но почему-то не происходит в vs 6.0 (сам вот тоже проверил из интереса).
Но если подключить iostream в виде

C++
1
#include <iostream>

то тогда конфликтов у vs с пространствами имён не возникает так что либо пишите так либо не пишите using namespace std раз уж таким образом подключили нужные вам библиотеки.



0



Эксперт CАвтор FAQ

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

Цитата
Сообщение от Evg
Посмотреть сообщение

-=ЮрА=-, ну, например, ты можешь написать проект с 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

Цитата
Сообщение от Alejo
Посмотреть сообщение

Можно пример (желательно для новичка) в котором 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

Цитата
Сообщение от Alejo
Посмотреть сообщение

может повредить программе ?

как вариант:

C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
 
using namespace std;
 
bool nothrow;
int main(){
    nothrow=true;
    std::cin.get();
    return 0;
}



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
Наверно из-за этого будет конфликт.

Миниатюры

Возникает ошибка с using namespace std;
 



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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// #include guard
#include"birthday.h"
#include<string>

class people
{
    public:
        people( std::string yourName, birthday DOB );

        void printInfo() const ; // non-modifier, so const
    
    private:
        std::string name;
        birthday date_of_birth;	
};

#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,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<string>

class people
{
    public:
        people( string yourName, int DOB );

        void printInfo() const ;
    
    private:
        string name;
        int date_of_birth;	
};

int main()
{
    return 0;
}

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.

Содержание

  1. Using namespace std declaration syntax error
  2. Using namespace std declaration syntax error
  3. Using namespace std declaration syntax error
  4. 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
Дата 10.10.2007, 12:59 (ссылка) | (нет голосов) Загрузка .
Код
#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
Дата 10.10.2007, 15:18 (ссылка) | (нет голосов) Загрузка .

Крокодил

Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5

Цитата
Код пишу в «Borland C++ v 4.5»

Borland C++ был выпущен в 1994 году. STL была включена в стандарт С++ весной 1994 года. Трудно требовать от компилятора полной поддержки стандарта, если компилятор писался во время или сразу после «по горячим следам» изменений стандарта. Но если ты собираешься изучать стандарт, то как начинающий начинающему посоветую поменять компилятор на более свежий.
(Кстати, не в самых новых учебниках прописывались такие ситуации ( ).

Daevaorn
Дата 10.10.2007, 15:24 (ссылка) | (голосов:4) Загрузка .

Эксперт

Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70

Цитата(akizelokro @ 10.10.2007, 16:18 )
STL была включена в стандарт С++ весной 1994 года.
mrbrooks
Дата 10.10.2007, 16:12 (ссылка) | (нет голосов) Загрузка .

трололомен

Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 2
Всего: 306

Эксперт

Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25

Daevaorn, ты и сам ВСЕГДА пишешь std:: перед стандартными функциями?

тут же речь о мелких прогах идет, тут еще можно.
главное, не зацикливаться, ибо в больших проектах, согласен, std:: писать надо.

Alek86
Дата 10.10.2007, 18:44 (ссылка) | (нет голосов) Загрузка .
Daevaorn
Дата 10.10.2007, 18:48 (ссылка) | (голосов:4) Загрузка .

Эксперт

Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70

Цитата(Alek86 @ 10.10.2007, 19:44 )
ты и сам ВСЕГДА пишешь std:: перед стандартными функциями?
Цитата(Alek86 @ 10.10.2007, 19:44 )
тут же речь о мелких прогах идет, тут еще можно.
SergeCpp
Дата 10.10.2007, 19:16 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

Репутация: 15
Всего: 124

Удивительно (и очень часто встречаю) — неужели является секретом имя автора C++?

Почему изучение начинается с книг весьма и весьма экстравагантных.

Почему бы не приобрести оригинал.

Слухи о трудности книги Страуструпа (если они повлияли на выбор) — весьма преувеличены

Greeen
Дата 10.10.2007, 19:55 (ссылка) | (голосов:1) Загрузка .

Опытный

Профиль
Группа: Участник
Сообщений: 710
Регистрация: 13.8.2006
Где: Петербург

Репутация: 7
Всего: 18

Профиль
Группа: Участник
Сообщений: 4
Регистрация: 9.10.2007

Репутация: нет
Всего: нет

chelser
Дата 10.10.2007, 22:41 (ссылка) | (нет голосов) Загрузка .
Цитата
SergeCpp, поддерживаю. Иногда диву даешься сколько всякий «С++ без проблем», «С++ бархатный путь» и еще всяких извращений на полках книжных магазинов. А реально стоящих книг раз-два и все.

Не совсем с вами согласен. Книги на которые вы ссылаетесь не спрю лучше, но информация в них преподносится так будто ее читающий минимум чемпион мира по программированию. Чайнику в данном вопросе очень трудно понять изложенную информацию. Выбор данной книги обусловлен исключительно вышеизложенным. Конечно после того как войду в курс дела воспользуюсь более серьезной литературой.

Добавлено через 3 минуты и 21 секунду
т.е. насколько я понял, то все мои вопросы сходятся к тому что я использую устаревший компилятор?

Добавлено через 6 минут и 45 секунд

Цитата
то как начинающий начинающему посоветую поменять компилятор на более свежий.
SergeCpp
Дата 10.10.2007, 23:05 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

Репутация: 15
Всего: 124

Цитата(chelser @ 11.10.2007, 00:41 )
Чайнику в данном вопросе очень трудно понять изложенную информацию

Я был чайником в данном вопросе (C++)

Взял и прочитал дома, тихо, спокойно, 1-е издание (самое старое) — полностью всё

Потом купил 2-е издание (в двух томах), таким же образом прочёл его — полностью всё

Сложностей при чтении особых не встретил

Интернетов с форумами не было да и незачем это (думать самому нужно)

Daevaorn
Дата 10.10.2007, 23:05 (ссылка) | (нет голосов) Загрузка .

Эксперт

Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70

Цитата(chelser @ 10.10.2007, 23:41 )
т.е. насколько я понял, то все мои вопросы сходятся к тому что я использую устаревший компилятор?
Цитата(chelser @ 10.10.2007, 23:41 )
плз подскажите где можно скачать новый компилятор
Цитата(chelser @ 10.10.2007, 23:41 )
и как заменить его

Профиль
Группа: Участник
Сообщений: 4
Регистрация: 9.10.2007

Репутация: нет
Всего: нет

chelser
Дата 10.10.2007, 23:47 (ссылка) | (голосов:4) Загрузка .
archimed7592
Дата 12.10.2007, 08:16 (ссылка) | (нет голосов) Загрузка .

Архимед

Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93

Цитата(Alek86 @ 10.10.2007, 18:44 )
ты и сам ВСЕГДА пишешь std:: перед стандартными функциями?

Я вот всегда пишу — у меня это уже рефлекс. Даже в форумах, 2-3 строчные примеры пишу с std.

Цитата(SergeCpp @ 10.10.2007, 19:16 )
Слухи о трудности книги Страуструпа (если они повлияли на выбор) — весьма преувеличены smile
akizelokro
Дата 12.10.2007, 08:37 (ссылка) | (голосов:7) Загрузка .

Крокодил

Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5

Цитата
2-3 строчные примеры пишу с std.
archimed7592
Дата 12.10.2007, 08:54 (ссылка) | (нет голосов) Загрузка .

Архимед

Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93

Цитата(akizelokro @ 12.10.2007, 08:37 )
некоторые руководства

Некоторые руководства, думаю, расчитанные не на новичка, которые редко знают о возможности ограничить scope или не догадываются, что если и советуют писать using blablabla , то ни в коем случае не в заголовочном файле и т.д.

Цитата(akizelokro @ 12.10.2007, 08:37 )
потому что хороший стиль
Dronchik
Дата 12.10.2007, 10:37 (ссылка) | (нет голосов) Загрузка .

Звукач ёмаё

Профиль
Группа: Участник
Сообщений: 451
Регистрация: 1.5.2007

Репутация: 0
Всего: 37

Код
#include

char qwerty[10];
CharToOem(«Приветn», qwerty);
cout

Добавлено через 3 минуты и 3 секунды
Локаль жрёт меньше ресурсов

Вместо слов делай дело, от которого ты фанатеешь. (с)

zkv
Дата 12.10.2007, 14:22 (ссылка) | (голосов:4) Загрузка .

Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92

Цитата(akizelokro @ 12.10.2007, 08:37 )
Когда я читаю некоторые руководства, они рекомендуют конкретно прописывать std::
Цитата(akizelokro @ 12.10.2007, 08:37 )
У до чертиков авторов оно парабезразлично.
Цитата(akizelokro @ 12.10.2007, 08:37 )
Какие еще есть аргументы
akizelokro
Дата 19.10.2007, 15:25 (ссылка) | (нет голосов) Загрузка .

Крокодил

Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5

Цитата
прям так и говорят: «Не пишите std::cout — это плохо, пишите using namespace std; а потом просто cout — это хорошо»?

Аргумент небезупречен. Что-то я не встречал «Не пишите никогда using namespace std; а потом просто cout — это плохо, пишите только std::cout — это хорошо».

Цитата
по возможности нужно использовать полностью квалифицированные имена

это аргумент. Но у меня, новичка, не возникло бы никаких вопросов, если бы в начала цитаты не было бы слов «по возможности».

Цитата
Здесь есть некоторая дискуссия на эту тему.

Прочитал. Более-менее серьезные аргументы в том, что не «засоряется» (кавычки мои) глобальное пространство имен и ускоряется компиляция. Про время компиляции, — поверю. По слову «засоряется», я все-таки поверю штатским тестовым сайтам, как они будут оформлять задачи по стандартной библиотке, которую эксперт должен знать наизусть.
У меня вывод — откровенно четкого определения и безупречных аргументов нет. При устройстве на работу буду следовать сложившимся правилам в компании.

Давайте, предупреждение у меня уже есть. Модерируйте.

archimed7592
Дата 19.10.2007, 15:33 (ссылка) | (нет голосов) Загрузка .

Архимед

Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93

Цитата(akizelokro @ 19.10.2007, 15:25 )
По слову «засоряется», я все-таки поверю штатским тестовым сайтам, как они будут оформлять задачи по стандартной библиотке, которую эксперт должен знать наизусть.

В задачках как правило используется не самый лучший стиль. Цель задачи описать проблему наиболее кратко и получить ответ на вопрос «умеет ли соискатель решать такого рода проблемы?».

Засоряется оно очень даже хорошо. Не раз сталкивался.

Mal Hack
Дата 10.7.2008, 14:51 (ссылка) | (нет голосов) Загрузка .

Мудрый.

Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 2
Всего: 261

Я проше прощения за поднятие старой темы, но вопрос по сабжу.
Есть ли разница в оптимальности (расход памяти, быстродействие) при обращении std::string или к своим нэймспейсам или без префикса имени пространства имен?
Дело в том, что для решаемой в данный момент задаче этот вопрос очень актуален, ввиду того, что программа выполняет определенные функции раз в 10 ms, и таких функций может быть несколько.

Lazin
Дата 10.7.2008, 15:54 (ссылка) | (голосов:1) Загрузка .

Эксперт

Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154

Эксперт

Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 11
Всего: 36

Rififi
Дата 10.7.2008, 19:50 (ссылка) | (голосов:3) Загрузка .
Цитата(chelser @ 10.10.2007, 12:59 )
в книгах настоятельно рекомендуют вставлять в программу эту строку. Пишут что using позволяет обращаться к обьектам например std::cout напрямую.
Mal Hack
Дата 10.7.2008, 20:45 (ссылка) | (нет голосов) Загрузка .

Мудрый.

Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 2
Всего: 261

Ulysses4j
Дата 10.7.2008, 22:20 (ссылка) | (нет голосов) Загрузка .

Опытный

Профиль
Группа: Участник
Сообщений: 304
Регистрация: 6.6.2007
Где: Ростов-на-Дону

Репутация: 4
Всего: 10

Цитата(Mal Hack @ 10.7.2008, 20:45 )
Rififi, простите, Герберт Шилдт — ламер?

Простите, позволю себе также ответить на поставленный вопрос: Герберт Шилдт — ламер. Последний перл: этот человек во вступлении к книжке по последней Java (6-ой, значится) все еще рассуждает на тему, является ли Java япом для интернета. Откопал экскременты мамонта, называется.

По сабжу: разницы нет. Все обращения, которые разнятся наличием квалификации пространства имен, связываются с объектами этих пространств имен на этапе компиляции. Упрощенно ситуацию можно представить так: на месте обращения к cout (квалифицированного или нет) компилятор вписывает адрес объекта. Пространства имен позволяют помочь компилятору понять, какой именно адрес написать (если имен cout несколько в разных пространствах имен). Как именно cout приписано к пространству имен (using или std::cout) компилятору неважно, лишь бы конфликтов не было. Он впишет нужный адрес и точка.

По сабжу выше: писать директивы включения пространст имен (using namespace . ) это nasty. Плохо, типа. В стендовых примерах можно. Ну, в тестовых рутинах, если очень уж неймется, с натяжкой. Но в продакш коде («библиотечном коде») никогда.

Это сообщение отредактировал(а) Ulysses4j — 11.7.2008, 05:29

JackYF
Дата 10.7.2008, 22:41 (ссылка) | (голосов:1) Загрузка .

полуавантюрист

Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162

Henpyxa
Дата 9.10.2010, 13:27 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Участник
Сообщений: 14
Регистрация: 9.10.2010

Репутация: нет
Всего: нет

почитал, поржал..
страуструп и впрямь книги писать не умеет, я новичок, пытался его читать, пока искал оптимальную настольную книгу. главе на 11 мозг дал сбой, и я без зазрений совести отказался от этого варианта.

и так и не дали вразумительного ответа, хорошо или плохо писать в начале кода using namespace блаблабла;
мне, как ламеру, это представляется разумным, исходя из примера. берешь ты книгу со стеллажа (например cout), отходишь от стеллажа, читаешь, нужна еще одна книга (тот же std::cout) — опять идешь к стеллажу, тратишь ресурс на обращения к стеллажу (иллюстрирована конструкция std::cout), вместо того, чтобы стоять около стеллажа и доставать нужные тебе книги (не расходуя лишних ресурсов).
или все устроено совсем не так? только громко не смейтесь

любитель

Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250

Henpyxa, если приблизить к Вашему стилюм, то вот так себя чувствует компилятор:

берет cout , думает кто ж это такой, благо находит подходящий только в std:: и успокаивается, значит это он.
берет cin, думает кто ж такой? находит один в std:: и один в anynamespace:: и озадачивает себя и программиста вопросом, а кой же использовать ?!
берет std::cin и без всяких раздумий использует его

mes
Дата 9.10.2010, 14:04 (ссылка) | (голосов:1) Загрузка .
azesmcar
Дата 9.10.2010, 14:15 (ссылка) | (нет голосов) Загрузка .

uploading.

Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211

Цитата(Henpyxa @ 9.10.2010, 13:27 )
страуструп и впрямь книги писать не умеет, я новичок, пытался его читать, пока искал оптимальную настольную книгу. главе на 11 мозг дал сбой, и я без зазрений совести отказался от этого варианта.

А ты Саттера попробуй
На самом деле Страуструп не для новичков пишет, осилить его книгу не так уж и просто, начни с чего нибудь попроще.

Цитата(Henpyxa @ 9.10.2010, 13:27 )
и так и не дали вразумительного ответа, хорошо или плохо писать в начале кода using namespace блаблабла;

Его нет, это вопрос предпочтений. Что точно можно сказать так это то, что в заголовочных файлах using писать НЕ хорошо, а в cpp пиши если хочешь. Как будет удобно.

boostcoder
Дата 9.10.2010, 14:16 (ссылка) | (голосов:1) Загрузка .

pattern`щик

Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110

особенно весело бывает когда раскрываешь несколько 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
Дата 9.10.2010, 14:17 (ссылка) | (нет голосов) Загрузка .
azesmcar
Дата 9.10.2010, 14:18 (ссылка) | (нет голосов) Загрузка .

uploading.

Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211

Цитата(Master01 @ 9.10.2010, 14:17 )
но одно верно «using namespace std» — это зло.

Это сообщение отредактировал(а) azesmcar — 9.10.2010, 14:20

boostcoder
Дата 9.10.2010, 14:19 (ссылка) | (нет голосов) Загрузка .

pattern`щик

Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110

Цитата(Master01 @ 9.10.2010, 14:17 )
boost::unit_test::something — мне что каждый раз тятнуть за собой эту тягомотину?
Код
namespace but = boost::unit_test;
.
but::something

любитель

Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250

mes
Дата 9.10.2010, 14:31 (ссылка) | (нет голосов) Загрузка .
Цитата(azesmcar @ 9.10.2010, 13:15 )
что в заголовочных файлах using писать НЕ хорошо, а в cpp пиши если хочешь. Как будет удобно.

дело даже не в заголовочных файлах а в области видимости..
в общем надо делать так чтоб «других» твои раскрытия видимости не коснулись..
«других» это не людей, а фрагментов кодов имеющих свою логику.. они могут быть как в одном файле , так и в разных..

Шустрый

Профиль
Группа: Участник
Сообщений: 89
Регистрация: 22.8.2007

Репутация: 2
Всего: 2

Master01
Дата 9.10.2010, 16:25 (ссылка) | (нет голосов) Загрузка .
Цитата(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
Дата 9.10.2010, 16:56 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Участник
Сообщений: 14
Регистрация: 9.10.2010

Репутация: нет
Всего: нет

Цитата
все знают что такое boost::unit_test

я не знаю что это такое к слову сказать, а где можно посмотреть-поизучать внутренности нэймспэйсов?

а насчет книги.. заметил где-то на форуме сообщение про http://worldcpp.vingrad.ru/, почитал, понравилось хотя материала и много, но все же маловато для полного понимания азов. хотя бы про классы в С++: пытался написать простенькую программку, используя знания, полученные от чтения фака, что-то типа

Код
class Prototipe
<
public:
double Calculate(double iResult)
<
double iRes;
iRes = iPrice + (iCode*(iPrice-(iPrice*0.18)))/100;
return iRes;
>;
char sName[200];
int iCode;
double iPrice;
>;

int main()
<
Prototipe payment;
char sRealName[20];
int iCooCode;
double iBuyPrice, iSellPrice;
cout > sRealName;
strcpy_s(payment.sName, sRealName);
cout > iBuyPrice;
cout > iCooCode;
payment.iCode = iCooCode;
payment.iPrice = iBuyPrice;
payment.Calculate(iSellPrice);
_getch();
>

и не вкурю никак про ошибку Run-Time Check Failure #3 — The variable ‘iSellPrice’ is being used without being defined. недостаточно там написано про классы и в шапке все-таки использовал using namespace std;
имхо, удобней указать один раз в маленьком коде, чем каждый раз втыкать перед cout’ами и cin’ами. про длинные коды даже страшно думать..

Crafty
Дата 9.10.2010, 17:33 (ссылка) | (нет голосов) Загрузка .

Опытный

Профиль
Группа: Участник
Сообщений: 319
Регистрация: 3.11.2008

Репутация: 2
Всего: 14

Добавлено через 4 минуты и 56 секунд

Цитата(Henpyxa @ 9.10.2010, 17:56 )
удобней указать один раз в маленьком коде, чем каждый раз втыкать перед cout’ами и cin’ами. про длинные коды даже страшно думать..
Код
using std::cout;
using std::cin;

Это сообщение отредактировал(а) Crafty — 9.10.2010, 17:35

boostcoder
Дата 9.10.2010, 20:21 (ссылка) | (нет голосов) Загрузка .

pattern`щик

Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110

Цитата(Master01 @ 9.10.2010, 16:25 )
Просто, все знают что такое boost::unit_test, а вот but придётся поискать определние.
Цитата(Henpyxa @ 9.10.2010, 16:56 )
заметил где-то на форуме сообщение про http://worldcpp.vingrad.ru/
azesmcar
Дата 9.10.2010, 20:28 (ссылка) | (нет голосов) Загрузка .

uploading.

Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211

Цитата(Master01 @ 9.10.2010, 16:25 )
Мне почему-то кажется, что вы готовы из рукава вытащить тройку-другую контраргументов для меня smile которые, в свою очередь, также можно контраргументировать .

Да нет, для этого аргументов не нужно. Аргументы нужны для обоснования того, что using namespace — зло

Цитата(Master01 @ 9.10.2010, 16:25 )
Правельнее было бы сказать, что Я предпочитаю такой подход не использовать, однако, не настаиваю, что моё мнение единственно правельное.

любитель

Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250

mes
Дата 10.10.2010, 09:55 (ссылка) | (нет голосов) Загрузка .
Цитата(Henpyxa @ 9.10.2010, 15:56 )
удобней указать один раз в маленьком коде,

в маленьком учебном или «для себя» коде можно вообще писать как угодно..
а вот если проект чуть побольше, то зачем создавать потенциальные проблемы,
если с cout и cin достаточно уникальны и проблем не будет, но вот тот же vector есть в куче разных библиотек..
и мало того что раскрытые имена могут создать неопределенность для компилятора, так и программисту с ходу не сразу будет понятно о чем речь..

Цитата(Henpyxa @ 9.10.2010, 15:56 )
чем каждый раз втыкать

вспомните народную мудрость «подальше положишь — поближе возьмешь».

Цитата(Master01 @ 9.10.2010, 15:25 )
вот but придётся поискать определние.

используемые синонимы неймспейсов легче запомнить, раз два и обчелся, чем уследить за всеми сущностями раскрытых пространств..

вобщем найдите хороший компромис, и код будет красивым и удобным

bsa
Дата 10.10.2010, 11:28 (ссылка) | (голосов:1) Загрузка .

Эксперт

Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196

Цитата(Henpyxa @ 9.10.2010, 14:27 )
берешь ты книгу со стеллажа (например cout), отходишь от стеллажа, читаешь, нужна еще одна книга (тот же std::cout) — опять идешь к стеллажу, тратишь ресурс на обращения к стеллажу (иллюстрирована конструкция std::cout), вместо того, чтобы стоять около стеллажа и доставать нужные тебе книги (не расходуя лишних ресурсов).
или все устроено совсем не так? только громко не смейтесь

На самом деле, в случае использования using namespace произойдет следующее: взяли пару стеллажей (количество пространств + глобальное + локальное) и вывалили все его содержимое в кучу, затем сказали компилятору, а нука найди мне cout в этой кучи.

Лично я считаю, что using namespace:
1. в глобальной области видимости в хидерах недопустимо. Сам сталкивался.
2. в глобальной области видимости .cpp файлах нежелательно.
3. внутри функций использовать можно, но лучше использовать переименование. Например, в документации к boost::program_options приводится такая вещь: namespace po = boost::program_options.

любитель

Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250

mes
Дата 10.10.2010, 12:20 (ссылка) | (нет голосов) Загрузка .
Цитата(bsa @ 10.10.2010, 10:28 )
взяли пару стеллажей (количество пространств + глобальное + локальное) и вывалили все его содержимое в кучу, затем сказали компилятору, а нука найди мне cout в этой кучи.

добавлю (хотя и было уже сказано) что если компилятору все равно в какой кучи искать, то программисту уследить за всеми связями в такой неразбирихи довольно сложно..

Henpyxa
Дата 11.10.2010, 08:16 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Участник
Сообщений: 14
Регистрация: 9.10.2010

Репутация: нет
Всего: нет

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ 🙂
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе — для этого существует «Центр Помощи».
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »

[ Время генерации скрипта: 0.2951 ] [ Использовано запросов: 21 ] [ GZIP включён ]

Источник

Читайте также:  Operation upload firmware error 113 pandora

Adblock
detector

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

Member Avatar

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;
}

Member Avatar


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.

Member Avatar

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

Member Avatar


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.

Понравилась статья? Поделить с друзьями:
  • Vaillant ошибка ebusy
  • Vaillant газовый котел ошибка f29 что делать
  • Vaillant газовый котел ошибка f28 причины как исправить ошибку
  • Vaillant газовый котел ошибка f20
  • Vaillant газовый котел коды ошибок