2010-04-15 14 views
9

para el uso de cout, necesito especificar tanto:incluyen y el uso de espacio de nombres en C++

#include<iostream> 

y

using namespace std; 

Dónde está definido cout? en iostream, ¿correcto? Entonces, ¿iostream está en el espacio de nombres std?

¿Cuál es el significado de ambas afirmaciones con respecto al uso de cout?

Estoy confundido por qué debemos incluir ambos.

+5

@Neil Entonces, ¿cuál es el propósito de SO? ¿Para hacer solo preguntas que no tienen forma de ser respondidas leyendo un libro o buscando en Internet? –

+1

@Neil Butterworth: ¡está bien! no más preguntas estúpidas después de esta, sin leer los conceptos de un libro. – Moeb

+6

@Kevin Cualquiera que crea que puede aprender C++ haciendo preguntas sobre SO se está engañando a sí mismo y está perdiendo el tiempo. –

Respuesta

9

iostream es el nombre del archivo donde se define cout. Por otro lado, std es un espacio de nombres, equivalente (en cierto sentido) al paquete de java.

cout es una instancia definida en el archivo iostream, dentro del espacio de nombres estándar.

Puede existir otra instancia cout, en otro espacio de nombre. Por lo tanto, para indicar que desea utilizar la instancia cout del espacio de nombres std, debe escribir

std::cout, indicando el alcance.

std::cout<<"Hello world"<<std::endl; 

Para evitar la std:: todas partes, puede utilizar la cláusula using.

cout<<"Hello world"<<endl; 

Son dos cosas diferentes. Uno indica alcance, el otro hace la inclusión real de cout.

En respuesta a tu comentario

imaginar que en iostream dos instancias con nombre cout existen, en diferentes espacios de nombres

namespace std{ 
    ostream cout; 
} 
namespace other{ 
    float cout;//instance of another type. 
} 

Después de incluir <iostream>, usted todavía tiene que especificar el espacio de nombres. La declaración #include no dice "Oye, utiliza el comando cout in std ::". Para qué sirve using, para especificar el alcance

+1

@Tom: cuando ya incluí el archivo ('iostream'), especifiqué qué definición de' cout' usar. Ahora el compilador sabe qué definición usar. Entonces, ¿cuál es el problema entonces? Todavía estoy confundido sobre por qué tengo que decir que está en el espacio de nombres 'std'. Eso debería haber sido necesario si hubiera alguna confusión. Aquí no hay confusión, ya que solo hay una definación de 'cout'. – Moeb

+0

Consulte mi respuesta actualizada – Tom

+0

@cambr: No, especificó una definición de 'cout' para usar. No hay ninguna razón por la que no pueda definir 'int cout;' después, aunque no es una buena idea. Podría decirse que el estándar de C++ podría haber requerido que los espacios de nombres sean ignorados si solo hay un espacio de nombres con un símbolo dado, pero no fue así, y no puedo pensar en un lenguaje que use espacios de nombres donde lo haga. –

1

cout se define lógicamente dentro de iostream. Por lógica, quiero decir que puede estar en el archivo iostream o puede estar en algún archivo incluido en iostream. De cualquier manera, incluir iostream es la forma correcta de obtener la definición de cout.

Todos los símbolos en iostream se encuentran en el espacio de nombres std. Para utilizar el símbolo cout, debe decirle al compilador cómo encontrarlo (es decir, qué espacio de nombres). Usted tiene un par de opciones:

// explicit 
std::cout << std::endl; 

// import one symbol into your namespace (other symbols must still be explicit) 
using std::cout; 
cout << std::endl; 

// import the entire namespace 
using namespace std; 
cout << endl; 

// shorten the namespace (not that interesting for standard, but can be useful 
// for long namespace names) 
namespace s = std; 
s::cout << s::endl; 
0

Las referencias #include <iostream> el archivo de cabecera que define cout. Si vas a usar cout, entonces siempre necesitarás el include.

No necesita using namespace std;. Eso es simplemente le permite usar la abreviatura cout y endl y similares, en lugar de std::cout y std::endl donde el espacio de nombres es explícito. Personalmente prefiero no usar using namespace ... ya que me exige ser explícito en mi significado, aunque es ciertamente más detallado.

+1

El compromiso es 'using std :: cout; usando std :: endl; ', después de lo cual puede usar' cout' y 'endl' sin calificación, sin incluir todo el espacio de nombres' std' en el espacio de nombres global. –

2

Si su implementación en C++ utiliza archivos de cabecera de estilo C (muchos lo hacen), entonces no es un archivo que contiene algo similar a:

#include ... // bunches of other things included 

namespace std { 

... // various things 

extern istream cin; 
extern ostream cout; 
extern ostream cerr; 

... // various other things 

} 

ETS es el espacio de nombres que el estándar de C++ mayoría de las cosas normales dice debe residen en. Esto es para evitar sobrepoblar el espacio de nombre global, lo que podría causarle dificultades para encontrar nombres para sus propias clases, variables y funciones que no se usan ya como nombres para cosas estándar.

Al decir

using namespace std; 

le está diciendo al compilador que usted quiere que buscar en el espacio de nombres std además del espacio de nombres global al buscar nombres. Si el compilador ve la línea de fuente:

return foo(); 

algún lugar después de la línea using namespace std; buscará foo en varios espacios de nombres diferentes (similar a ámbitos) hasta que encuentra un foo que cumpla con los requisitos de esa línea. Busca espacios de nombres en un orden determinado. Primero se ve en el ámbito local (que en realidad es un espacio de nombre sin nombre), luego el alcance más local hasta una y otra vez hasta fuera de una función, luego en las cosas nombradas del objeto adjunto (métodos, en este caso), y luego en nombres globales (funciones, en este caso a menos que haya sido tonto y sobrecargado() que estoy ignorando), y luego en el espacio de nombres estándar si ha utilizado la línea using namespace std;. Es posible que tenga los dos últimos en el orden incorrecto (puede buscarse de manera estándar antes que global), pero debe evitar escribir código que dependa de eso.

Cuestiones relacionadas