Модераторы: Daevaorn
   

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> using namespace std vs std::... в чем разница 
:(
    Опции темы
Rockie
Дата 12.11.2006, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Здравствуйте!

Вот два варианта программы:

Код
#include<iostream>

using namespace std;

void main(){

 cout<<"Something"<<'\n';

}


Код
#include<iostream>

void main(){

 std::cout<<"Something"<<'\n';

}


Второй чем-то выгодно отличается от первого?
PM   Вверх
Sartorius
Дата 12.11.2006, 18:16 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



 первый выгодно отличается от второго smile  Потому что не надо каждый раз std писать. Однако больше трех пространств имен подключать не рекомендуется, тк возможет конфликт идентификаторов
PM MAIL ICQ   Вверх
Daevaorn
Дата 12.11.2006, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Rockie @  12.11.2006,  19:13 Найти цитируемый пост)
Второй чем-то выгодно отличается от первого? 

Да. Не засоряется глобальное пространство имен. И потенциально, при большОм количестве кода, увеличивается скорость компиляции.
PM MAIL WWW   Вверх
archimed7592
Дата 12.11.2006, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



не знаю почему, но мне кажется самым правильным 3-й вариант
Код
#include<iostream>
#include <ostream>

using std::cout;
using std::endl;
void main(){

 cout<<"Something"<< endl;

}


в принципе, в любом случае не рекомендую делать так для стандартных библиотек:
Код
#include<iostream>

void main(){

 int cout = 5;

 std::cout<< "Something" << cout << std::endl;

}
даже, если появится огромное желание так сделать - кому-то когда-нибудь придется разбираться в ваших исходниках


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Rockie
Дата 12.11.2006, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Sartorius @  12.11.2006,  18:16 Найти цитируемый пост)
первый выгодно отличается от второго   Потому что не надо каждый раз std писать.

Sartorius, согласен, но почему-то часто вижу второй вариант. Вот и решил поинтересоваться.

Цитата(Daevaorn @  12.11.2006,  19:08 Найти цитируемый пост)
Да. Не засоряется глобальное пространство имен.

Daevaorn, ага! А можно поподробнее? То есть грубо говоря в первом случае при каждом вызове cout компилятор будет "пробегаться" по неймспейсу и искать его,  поэтому медленнее? На размер исходника это не влияет, как понимаю, то есть компилятор возьмет из неймспейса только то, что нужно и не больше?

Код
 int cout = 5;

archimed7592, ничего себе smile Первый раз такое вижу. Хотя впринцыпе в первом варианте это не пройдет.

Это сообщение отредактировал(а) Rockie - 12.11.2006, 19:25


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Daevaorn
Дата 12.11.2006, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Rockie @  12.11.2006,  20:17 Найти цитируемый пост)
То есть грубо говоря в первом случае при каждом вызове cout компилятор будет "пробегаться" по неймспейсу и искать его,  поэтому медленнее?

Грубо говоря, да.
Цитата(Rockie @  12.11.2006,  20:17 Найти цитируемый пост)
На размер исходника это не влияет, как понимаю, то есть компилятор возьмет из неймспейса только то, что нужно и не больше? 

Нет, не влияет. 
PM MAIL WWW   Вверх
archimed7592
Дата 12.11.2006, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Цитата(Rockie @  12.11.2006,  20:17 Найти цитируемый пост)
 Хотя впринцыпе в первом варианте это не пройдет.

Код
using namespace std;

#define TEST

int main(int argc, char *argv [])
{
#ifdef TEST
    int cin = 5;
#endif
    cout << cin << endl;

         return 0;
}
в обоих случаях скомпилируется. в случае #define TEST выведет 5, иначе произойдет неявное преобразование cin к void*


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
EvgenZ
Дата 12.11.2006, 20:27 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Freedom in me
**


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

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



Меня учили, что using namespace std; писать вообще нигде не стоит... лучше писать using std::cout; или std::cout<< "Something" << cout << std::endl;. Как говорил мне один человек: 
Цитата
В хедерах никогда нельзя использовать using namespace SomeNamespace;
Ибо в таком случае просто весь смысл от пространств имен теряется и получаешь ужасный геморрой.

я с ним польностью согласен. Другой говорил следующее:
Цитата
В рамках функции, например, я бы использовал using namespace std; а в общем случае - std::... 

с ним я тоже польностью согласен  smile .



--------------------
<удалено администрацией форума>
PM MAIL   Вверх
Rockie
Дата 14.11.2006, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(EvgenZ @  12.11.2006,  20:27 Найти цитируемый пост)
В хедерах никогда нельзя использовать using namespace SomeNamespace;Ибо в таком случае просто весь смысл от пространств имен теряется и получаешь ужасный геморрой.

а почему? Потомучто в разных неймспейсах может быть к примеру одна и та же переменная?

Цитата(EvgenZ @  12.11.2006,  20:27 Найти цитируемый пост)
В рамках функции, например, я бы использовал using namespace std; а в общем случае - std::... 

..почему? Это статья, можно почитать?




--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Fazil6
Дата 14.11.2006, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

а почему? Потомучто в разных неймспейсах может быть к примеру одна и та же переменная?

потому, что все объявленное в областьи видимости нэймспэйса становится видимым глобально
Цитата

..почему? Это статья, можно почитать?

да забудьте вы о usung. Не отвалятся у вас пальцы std набрать. Код нагляднее. Если длинные имена получаются, так typedef есть
PM MAIL   Вверх
EvgenZ
Дата 14.11.2006, 23:34 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Freedom in me
**


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

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



Нет, это не статья, это просто говорили мне люди которые с этим довольно плотно работали.
1. Да.
Неймспейсы и созданы для исключения путаницы с именами, а написав using namespace ; сразу вся идея пропадает,  они становятся открытыми и наступает полный провал. А если большой проект разрабатывается группой программистов и у каждого повторяются имена... 
2.
Область действия функции - функция -> небольшая область где все можно просмотреть без особого гемора и можно особо не преживать, что случится путаница в именах (и то не всегда).

Есть неименованные пространства имен например
Код

//one.cpp
namespace{
    int a=5;
...
...
///
}

//two.cpp
namespace{
    int a=10;
....
...
///
}
int main(){
int b = a;
}

и никой путаницы для каждого нэймспэса файл является болком трансляции, т.е. b будет равна 10.


--------------------
<удалено администрацией форума>
PM MAIL   Вверх
Rockie
Дата 15.11.2006, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(EvgenZ @  14.11.2006,  23:34 Найти цитируемый пост)
1. Да.Неймспейсы и созданы для исключения путаницы с именами, а написав using namespace ; сразу вся идея пропадает,  они становятся открытыми и наступает полный провал. А если большой проект разрабатывается группой программистов и у каждого повторяются имена... 2.Область действия функции - функция -> небольшая область где все можно просмотреть без особого гемора и можно особо не преживать, что случится путаница в именах (и то не всегда).

EvgenZ, спасибо.

Цитата(EvgenZ @  14.11.2006,  23:34 Найти цитируемый пост)
и никой путаницы для каждого нэймспэса файл является болком трансляции, т.е. b будет равна 10.

попрбовал,
Код
int b = a;
 
Цитата
[C++ Error] E2451 Undefined symbol 'a'



--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
EvgenZ
Дата 16.11.2006, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Freedom in me
**


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

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



Код

#include<iostream>

namespace{
    int a=10;
}

int main(){
//int a = 5;    //1
int b = a;
int a = 5;      //2
std::cout << b;
}

да вроде работает... выводит "10". Если закоменчена 1 строка и "5" если закоменчена 2.


--------------------
<удалено администрацией форума>
PM MAIL   Вверх
   
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

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

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

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


 




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


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.