Este dilema se puede solucionar de diversas formas, sin embargo te mostramos la que en nuestra opinión es la solución más completa.
Solución:
Todas las definiciones de la biblioteca estándar están dentro del espacio de nombres estándar. Es decir, no están definidos en el ámbito global, por lo que para usarlos debe calificarlos de una de las siguientes maneras:
std::cout
using namespace std
using std::cout
Por ejemplo, tomemos esto:
// declarations
int global_variable;
namespace n
int variable2;
global_variable
se puede acceder tal como es:
int x;
x = global_variable;
Pero variable2 no es parte del espacio global, sino parte del namespace n
.
int x;
x = variable2; // error variable2 identifier not found.
Así que tienes que usar el nombre completamente calificado:
int x;
x = n::variable2;
Como atajo puedes escribir:
using namespace n;
int x;
x = variable2; // variable2 is searched in current namespace
// and in all namespaces brought in with using namespace
// Found ONLY in namespace n -> OK
o
using n::variable2; // this makes any unqualified reference to `variable2`
// to be resolved to `n::variable2`
int x;
x = variable2;
En cuanto a los archivos de cabecera, iostream.h
fue utilizado por muchos compiladores antes de que existiera un estándar. Cuando el comité intentó estandarizar, decidió hacer que los encabezados de C++ no tuvieran extensión para no romper la compatibilidad con el código existente.
Porque esta línea comienza con #
, se denomina “directiva de preprocesador”. El preprocesador lee su programa antes de compilarlo y solo ejecuta aquellas líneas que comienzan con #
. El preprocesador configura su código fuente para el compilador.
los #include
La directiva hace que el preprocesador incluya el contenido de otro archivo en el programa. los iostream
El archivo contiene código que permite que un programa C++ muestre la salida en la pantalla y tome la entrada del teclado. los iostream
Los archivos se incluyen en el programa en el punto en que se #include
aparece la directiva. los iostream
se denomina archivo de cabecera y aparece en la parte superior o cabecera del programa.
using namespace std;
C++ usa espacios de nombres para organizar nombres o entidades de programas. Declara que el programa estará evaluando entidades que forman parte del namespace
llamado “estándar”. Cada nombre creado por el iostream
el archivo es parte de eso namespace
.
1.Si incluyo el
iostream
biblioteca, ¿por qué es unnamespace
necesario para encontrarcout
? hay otrocout
en algún lugar que podría causar un conflicto de nombres?
Es necesario porque el estándar C++ requiere que cout
estar dentro de la std
espacio de nombres Ahí pudo ser un choque cout
pero no en la biblioteca estándar (por ejemplo, su propio código o alguna biblioteca de terceros).
1.Qué fue exactamente
iostream.h
antes de que se cambiara aiostream
?
Podría ser cualquier cosa, porque no es parte del estándar, pero era el nombre de un encabezado previo a la estandarización que formó la base para iostream
. Por lo general, declaró todos los nombres en el espacio de nombres global, por lo que es probable que el ejemplo que está viendo se haya escrito antes de la estandarización.
2. Hizo namespace
participar en este cambio?
Esta pregunta no está clara. la palabra clave namespace
puede usarse dentro de implementaciones, y se usa para declarar y definir datos, funciones, tipos, etc. dentro de un espacio de nombres. asi que tenia algunos parte de este cambio.
namespace foo
void bar(); // declares foo::bar