2010-03-24 4 views
3
#include <iostream> 
using namespace std; 

int main() { 
    cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!! 
    return 0; 
} 

Если я удалю второй оператор, сборка завершится неудачно.Зачем использовать пространство имен std здесь?

Зачем это необходимо?

+9

Что книга, которую вы изучаете на C++, должна сказать об этом? – 2010-03-24 16:56:32

+2

ваш комментарий действительно полезен :) –

ответ

12

Потому что cout и endl содержатся внутри пространства имен std.

Вы можете удалить линию using namespace std и поставить вместо этого std::cout и std::endl.

Вот пример, который должен сделать пространство имен ясно:

Stuff.h:

namespace Peanuts 
{ 
    struct Nut 
    { 
    }; 
} 


namespace Hardware 
{ 
    struct Nut 
    { 
    }; 
} 

Когда вы делаете что-то вроде using namespace Hardware вы можете использовать Nut без указания имен в явном виде. Для любого источника, который использует любой из этих классов, им необходимо: 1) включить заголовок и 2) указать пространство имен класса или поместить директиву using.

Точка пространств имен предназначена для группировки, а также для избежания конфликтов пространства имен.

Edit для вашего вопроса о том, почему вам нужно #include:

#include <iostream> включает в себя источник cout и endl. Этот источник находится внутри пространства имен, называемого std, которое находится внутри iostream.

+0

В качестве альтернативы вы можете опустить 'using namespace std' и вместо этого изменить' cout' и 'endl' на' std :: cout' и 'std :: endl'. –

+0

Тогда что такое 'iostream'? Определяется ли std в iostream? – symfony

+0

Вы включаете заголовок 'iostream', однако' cout' и 'endl' все еще находятся в пространстве имен std (' std :: cout' и 'std :: endl'). 'iostream' определяет вещи в std, но это не единственный заголовок, который делает это. Например. 'std :: string' определяется в' string'.Директива 'use' импортирует все из пространства имен std. –

2

cout является частью пространства имен std. Теперь, если вы должны использовать «std :: cout» и удалить вторую строку, тогда она будет компилироваться.

+3

и endl -> std :: endl – corn3lius

0

Да соиЬ и сегг определены в isotream, но, как станд :: соиЬ и станд :: сегг

Причина этого заключается в том, что вы можете спокойно использовать общие слова, как мин или макс без worryign, что некоторые стандартной библиотеки уже подал в суд на них, просто напишите std :: min и std :: max. Это ничем не отличается от старого способа размещения, например, «afx» перед всеми функциями библиотеки ATL.

Утверждение «использование» объясняется тем, что люди жаловались на дополнительную набираемость, поэтому, если вы ставите «использование std», предполагается, что вы имели в виду std :: перед всем, что исходит от стандарта.
Единственная проблема в том, что у вас есть библиотека под названием mystuff, которая также имеет min() или max(). Если использование использует std :: min() и mystuff :: min(), нет проблем, но если вы поместите «использование std» и «using mystuff», вы вернетесь к той же проблеме, что и в 'c'

пс. как правило, рекомендуется установить std :: cout, чтобы дать понять людям, что это стандартная версия regualr, а не локальная версия cout, которую вы создали.

Смежные вопросы