Confusión de Programación: Los inicios en C++
Hace 2 semanas y media un compañero de la universidad me presto una biblia de C++. Ese mismo fin de semana me puse a leer el librote y decidí probar el famosísimo “Hola Mundo”, aquí el programa:
#include<iostream.h>;
int main()
{
cout << "Hola mundo, C++!" << endl;
return 0;
}
Compilando y de pronto… zaz!!!
Línea 1.- #warning This file includes at least one deprecated or antiquated header.
Resulta ser que hay ciertos estándares que hay que seguir xD (aquí va otra paranoia mia tipo W3C), entonces busque algo de información al respecto y en efecto, ahora ya no lleva .h, ahora simplemente es #include<iostream> así que corregí y compilé nuevamente
…
Línea 4.- In function int main(): cout undeclared (first use this function)
Línea 4.- (Each undeclared identifier is reported only once for each function it appears in.): endl undeclared (first use this function)
Otra vez errores, ahora resulta ser de que cout, endl, cin, etc… necesitan declararse. Una de dos: dejar de programar en C++ por 2 años lo deja a uno bastante desactualizado ó nunca había usado un compilador que se basara en los estándares (en la prepa en la materia de programación estructurada usabamos borland y fueron cosas básicas las que aprendimos
), aunque ya estoy pensando que pueden ser ambas razones pero bueno…
…investigando más sobre el tema encontré que para declararlos hay 3 formas distintas de hacer esto básicamente.
//primera forma[GLOBAL]:
#include<iostream>
using namespace std;
int main()
{
/*instrucciones*/
}
//segunda forma[DECLARANDO UNA POR UNA]:
#include<iostream>
using std::cout;
using std::cin;
using std::endl;
//using std::/*etc..*/;
int main()
{
/*instrucciones*/
}
//tercera forma[DECLARANDO AL MOMENTO DE USO]:
#include<iostream>
int main()
{
int x;
std::cout << "Teclee un numero: ";
std::cin >> x;
return 0;
}
En la primera forma le estas diciendo al compilador que declare todo lo contenido en el “namespace std” y esto puede causar conflictos al declarar accidentalmente una variable, clase o una función que tenga el mismo nombre que alguna en el “namespace std”, además de estar declarando todo el contenido del “namespace std” el cual posiblemente no llegues a ocupar por completo de modo que solo gastas recursos.
La segunda forma es la que usualmente recomiendan, ya que no declaras todo el contenido del “namspace std” si no solamente lo que usarás de él, sin embargo hasta cierto punto puede resultar poco práctico.
La tercera forma es la que uso yo, ya que de este modo por lo menos para mi queda más claro el código y además no es declarado de manera global, sino solamente donde es utilizado.
Ahora que ya corregi estos errores a compilar se ha dicho!!!
Aquí el nuevo código:
#include<iostream>
int main()
{
std::cout << "Hola mundo, C++" << std::endl;
return 0;
}
Perfecto!!! ningún error, ¿a ver el ejecutable?
zazzzz!!!! ¿murió el ejecutable? ¿pero por qué se cerro? T_T . Nuevamente a Googlear…
otro tanto tiempo después…
solución!!! usar system(“pause”);, pues bien veamos si funciona correctamente, reescribimos el código…
#include<iostream>
int main()
{
std::cout << "Hola mundo, C++" << std::endl;
system("pause");
return 0;
}
Al compilar esto el programa se detiene y muestra en pantalla un mensaje que dice: “Presione una tecla para continuar…” Vemos que el resultado es el esperado, el programa hace una pausa y al presionar cualquier tecla va al return 0; y se termina el programa, pero… ¿qué tal si quiero personalizar el mensaje?
Esa pregunta para alguien que ya sabe C++ es algo trivial e incluso pensé que encontraría una solución a la vuelta de la web y aunque no fue así de rápido, fue buena idea preguntarme eso ya que googleando la instrucción system(“pause”); me encontré con que no era algo correcto usarla debido a que efectuaba varias acciones:
1. Suspende el programa.
2. Llama al sistema operativo.
3. Abre la consola ó símbolo del sistema (ms-dos) [vuelve a ejecutar el sistema operativo en un subproceso].
4. El sistema operativo debe encontrar el comando PAUSE.
5. Destina la memoria para ejecutar el comando.
6. Ejecuta el comando y espera la pulsación de alguna tecla.
7. Libera la memoria.
8. Sale del sistema operativo.
9. Reanuda el programa.
Además de esto, NO ES COMPATIBLE EN OTROS SISTEMAS OPERATIVOS, es necesario usar winBugs para que la instrucción funcione correctamente, así que en cuanto a portabilidad para compilarlo en otro sistema ni pensarlo, no es multiplataforma.
Investigando al respecto encontré algunas alternativas. Para C: getchar(). Para C++: cin.get(). Como estoy programando en C++ la segunda opción es la necesaria para hacer lo que deseo pero antes de utilizar esta otra instrucción decidí googlear un poco más para ver si había alguna otra alternativa para hacer una pausa y esto fue lo que encontré: getch()
Al tener estas 2 alternativas me dispuse a escribir las sentencias correspondientes, al recompilar el código hubo una diferencia notable pero pequeña entre ambas. El código:
//usando cin.get()
#include<iostream>
int main()
{
std::cout << "Hola mundo, C++" << std::endl;
std::cin.get(); //usa std::
return 0;
}
//usando getch()
#include<iostream>
#include<conio.h> //usa la librería conio.h
int main()
{
std::cout << "Hola mundo, C++" << std::endl;
getch(); //fácil de escribir
return 0;
}
Al usar cin.get() lo que pasó fue que escribía cualquier caracter y aparecía en pantalla, de modo que es necesario presionar enter para cerrar el programa.
Al usar getch() me di cuenta que cerraba el programa al presionar cualquier caracter, de modo que estaba a punto de elegir usar getch() pero al recordar que usaba una líbrería más me puse a googlear nuevamente y me encontré que conio.h no pertenece a la biblioteca estandar de ANSI C y tampoco a la de C++, en efecto como lo podrán ver en los siguientes links: Biblioteca estandar C++, Biblioteca estandar C.
Entonces aquí por comodidad pueden usar getch() aunque es MUY recomendable seguir los estándares
además así se evitan incluir una librería extra que por cierto no está en el compilador de GNU/Linux. Ahora con respecto a cin.get() hay situaciones en las que usar esto no funciona como se espera debido a que cuando se pide un dato al usuario este se almacena en el buffer y por tanto para hacer que funcione correctamente cin.get() hay que limpiar ese buffer, para ello se utiliza cin.sync()
Ahora el código final:
#include<iostream>
int main()
{
std::cout << "Hola mundo, C++" << std::endl;
std::cin.sync(); /* En este ejemplo no es necesario agregar esta línea de código, solo es una referencia de su uso */
std::cin.get();
return 0;
}
Y bien así es como se pone un Hola mundo en C++ xD , trivial ¿no? y a pesar de todo este rollote se me hace más bonito C++ que Visual Basic, amén.
Nota: soy ateo igual que dios, pero pronto me volveré googleista ya que respondio muchas de mis plegarias que fueron expuestas en este post.
Nota2: Si a alguien le sirvió de algo todo este rollo aquí explicado agradezcan a google (y a León!!! xD ).
Nota3: Yo soy León
.
Nota4: Cualquier error ya sea de sintaxis o de cualquier otro tipo, duda o sugerencia favor de dejar un comentario al respecto.
Referencias: Google, Wikipedia y GIDNetwork
Comments(22)

Uhhh!!! No entendí mucho, pero me da gusto que estés avanzando en esto de la programación. Nunca aprendí nada de C ni de C++, así que esto está en chino para mí. Je, je
@Andrés: Está muy interesante esto de C y C++
deberías de leer acerca de ello
jeje
. Nada mas es cosa de echarle una leída a un libro y googlear un poco xD .
Se lo digo de nuevo usted esta enfermo por dios, yo entiendo que deseaba programar en c++ pero por que no empezo con los basicos: printf, scanf,no niego que usar cin y count hacen de su hola mundo algo super vistoso. Aunque toda la investigacion ya lo hace mejor que muchos desarrolladores que conosco siga adelante.
@darkquicksilver: pues el libro que me prestaron empieza con cout y cin, de hecho la biblia que acabo de sacar de la biblioteca (Standard C++ Bible, así se llama no bromeo) comienza con std::cout y std::cin
. En fin, creo que me pude haber ahorrado la investigación si hubiera sacado este libro de estándares antes, pero bueno esto que investigue se explica en el libro mas o menos a la mitad del mismo xD , lo malo que esta en inglés, casi no hay buenos libros en español
.
Saludos Sr. DQS y disculpe haber tardado en responder, no me había dado cuenta que su comentario se fue al spam :S .
otra cosa que se me olvidaba comentar, scanf dicen que causa conflictos pero ya lo investigaré mas adelante
Saludos
Jejejeje me da gusto que te adentres en C y C++ son de los lenguajes que mas cariño le tome desde la universidad, lo que te puedo sugerir para que evites este tipo de situaciones es que selecciones un ANSI C para que de ahi te bases en estandares o por ejemplo un cross compiler como GCC que es un compilador muy fuerte y funciona en todas las distrubuciones de Linux y Sabores de Unix, tambien en Windows con su implementacion GW32, pase un buen tiempo programando en C cuando era estudiante, con el tiempo aprendi que no hay limite para lo que se puede hacer con este lenguaje, un gran ejemplo es el Kernel de Linux que esta programado en C
Saludos
Dante
@Dante: Gracias por tus sugerencias Dante
, en efecto en introducción a la programación parece que usaremos C++
a ver que tal me va cuando lleve esa materia pero no estoy seguro de que compilador usan por que vi el code::blocks y el dev-C++ en fin.
Saludos
El Dev-C++ alguna vez lo llegue a usar, cuando yo empeze en la universidad aunque no me lo creas usabamos el Turbo C++ de Borland, y era un relajo cuando querias usar tu mismo codigo en otro compilador, con el tiempo conoci a GCC y de ahi me adentre mas en ese compilador especificamente, como quiera conocer lo que se le dice “C Style” te va a permitir facilmente ver otros lenguajes como C#,Java, PHP y Javascript, ya que usan un formato de sintaxis muy similar en las sentencias de control, donde se marca mucho la diferencia es en la Programacion Orientada a Objetos (OOP) que hay hay mas conceptos y dependen mucho del lenguaje tales como los NameSpaces, las cabeceras y demas lindezas.
Hechale ganas vas por buen camino, te lo dice un Desarrollador de Vieja Guardia
Saludos
Dante
A veces me pregunto que onda se supone que soy programador de neuva generacion por asi decirlo 97 en adelante y aun asi vivi las carencias que menciona Dante es la muerte programar sobre C++ de Borland y eso mismo correrlo en otro compilador. Pero animo Leon va por buen camino .
Nota: como puede ser que me tenga en sus filtros de spam. Me acaba de perder leon.
@Dante: muchas gracias por tus consejos Dante
@Darkquicksilver: gracias dqs, no es mi culpa
akismet te reconoce como spam
no sé porque disculpa las molestias xD .
Hola Leon Estube probando tu inicio del hola mundo y tu forma de programar en verdad muy buena, todos los metodos que encontraste para hacer una pausa muy bien de tu parte, quiero agregar que esto de la pausa puede manejarse con un while por si algun dia quieres poner mensajes de salidas o algo esto seria de la siguente forma:
#include
int main()
{
char quit;
quit = ”;
while (quit != ‘q’)
{
std::cout << “Hola mundo, C++” << std::endl;
std::cout << “Pressione q para salir ” <> quit;
}
return 0;
}
Con esta otra forma puedes decirle como salir a quien use el programa o ponerle el mensaje o la letra que prefieras, creo que esa fue una de las inquietudes que tenias al usar el system(“pause”); bueno me comenta.
@Discreto815: interesante la forma en la que planteas la pausa, aunque debe haber una forma mas compleja para que con detectar una sola tecla se salte la pausa aunque creo que sería mejor con que solo detectara el enter y al teclear otra cosa no la mostrara en pantalla. :3 . El system(“pause”) no lo uso debido a las razones antes enlistadas. Saludos.
Gracias!! y buen Blog!!
@Martin: De nada Martin, que bueno que te haya servido
Saludos
hola q tal!!leon y todos los chicos !
mira yo en la facultad tambien uso turbo c++
y tambien tengo muchos manuales pdf q explican con cout:: y cin::
e de ahi que google y encontre tu web.
el caso es que aunque escriba cualquiera de tus codigos aca sitados por ejemplo:
#include<iostream.h>
int main()
{
std::cout << "Hola mundo, C++" << std::endl;
std::cin.get();
return 0;
}
Me aparece igualmente la siguiente linea de error:
___________________________________________________________________
type qualifier ‘std’must be a structor class name in function main()
___________________________________________________________________
Ponga lo que ponga
y por cierto <iostream.h> debo escribir para que incluya esa libreria
si sabes alguna respuesta te lo agradeceria mucho!
;)
@loli: lo que pasa es que el compilador que uso es Dev-C++ y pues Turbo C++ hasta donde sé no sigue los estándares es por eso que no sigue el estándar que dice que ahora las librerías declaradas en C++ se escriben sin el .h y tampoco requiere el std::
:3
simplemente usa cout y cin sin std:: y el iosream.h . Si vas empezando es muy recomendable que sigas los estándares así que te recomiendo Dev-C++, además es gratuito
=0
deberias hablar de c#
XD
gracias! igualmente me parece que no me dejan rendir con dev.solamente turbo.
.pero me va a servir lo que me dijistes.
Ya ni te dije tio xD
tiene razon otro comentario que ponen por ahi que deberias de iniciar con el
printf y scanf que son mas aburridos, pero valen xD
es que el libro que te preste es orientado a objetos creo o algo asi se llama
total, es el segundo libro xD
el primero si empieza con printf y scanf
pero ese no lo tengo T_T
Hola , una pregunta sobre el cin.get(), porque , hay veces en que es necesario usar dos veces cin.get() al final del codigo…porque con un solo cin.get(). no se detiene la pantalla. Gracias.
@daael: No, bueno al menos a mi no me sucede eso probablemente tienes algo en el buffer, intenta usando cin.sync() como lo mencioné en el artículo para limpiar el buffer a ver si es eso.
Saludos.
Hay una nueva actualización de este post en Confusión de Programación: Los inicios en C versión 2