El programa
Este es el programa Hola mundo completo en C++. Pulsa Run para compilarlo y ejecutarlo en el navegador:
Imprime una línea:
Hello, World!
Cinco líneas de código, y cada una tiene una tarea concreta. Las secciones de abajo las recorren en orden y luego explican cómo compilar el mismo archivo en tu propio ordenador y qué suelen significar los primeros errores del compilador.
Línea a línea
#include <iostream>
Las líneas que empiezan por # son instrucciones para el preprocesador, que se ejecuta antes que el compilador propiamente dicho. #include <iostream> pega las declaraciones del encabezado estándar <iostream> (streams de entrada/salida). En ese encabezado se declaran std::cout y std::endl. C++ no tiene una instrucción de impresión integrada; imprimir forma parte de la biblioteca estándar, y la incorporas con esta línea.
int main() {
Todo programa en C++ empieza a ejecutarse en una función llamada main. Tiene que haber exactamente una, y debe escribirse en minúsculas. El int de delante indica que main devuelve un entero al sistema operativo cuando termina. Los paréntesis vacíos significan que aquí no recibe argumentos, y la llave de apertura { inicia el cuerpo de la función.
std::cout << "Hello, World!" << std::endl;
Esta línea es la que imprime.
std::coutes el stream de salida estándar, normalmente la terminal. El prefijostd::indica quecoutvive en el espacio de nombresstd, donde se guarda toda la biblioteca estándar.<<es el operador de inserción. Envía el valor de su derecha al stream de su izquierda. Puedes encadenarlo, y cada<<añade la siguiente pieza a la misma salida."Hello, World!"es un literal de cadena: texto entre comillas dobles.std::endltermina la línea.- El punto y coma termina la sentencia. Toda sentencia en C++ necesita uno.
return 0;
return termina main y devuelve un valor al sistema operativo. Por convención, 0 significa que el programa terminó bien, y cualquier otro número indica un error. Los scripts y las herramientas de compilación leen este código de salida. Dentro de main la línea es opcional: si la ejecución llega a la llave de cierre, C++ se comporta como si hubieras escrito return 0;.
La llave de cierre
La llave de cierre termina el cuerpo de main y, con él, el programa.
std::endl vs '\n'
Hay dos formas habituales de terminar una línea, y ambas aparecen en código real:
Salida:
Hello, World!
Hello again!
Line one
Line two
El resultado visible es el mismo. La diferencia es que std::endl escribe un salto de línea y después vacía el stream, lo que envía de inmediato a la terminal el texto que haya en el buffer. '\n' solo escribe el salto de línea, y el stream se vacía según su propio criterio (como muy tarde, al terminar el programa). En un bucle que imprime miles de líneas, los vaciados extra de std::endl suponen una diferencia medible, así que muchos programadores de C++ usan '\n' por defecto y reservan std::endl para cuando el texto tiene que aparecer en ese momento. La secuencia de escape \n también funciona dentro de una cadena, como muestra la tercera línea. La página de entrada y salida trata cout y cin con más detalle.
La versión con using namespace std;
Muchos tutoriales escriben Hola mundo así:
using namespace std; le dice al compilador que busque en el espacio de nombres std los nombres que no encuentre en otro sitio, así que cout y endl funcionan sin el prefijo. Está bien para programas pequeños y ejercicios. En código más grande y en archivos de encabezado se suele evitar, porque trae al ámbito cientos de nombres estándar que pueden chocar con los tuyos (una función tuya llamada count o distance, por ejemplo). Escribir std::cout cuesta cinco caracteres y elimina el riesgo.
Compilar y ejecutar Hola mundo en tu ordenador
El editor del navegador compila por ti. En tu propia máquina haces tú mismo los mismos dos pasos: compilar el archivo fuente en un ejecutable y después ejecutarlo. Primero necesitas tener instalado un compilador de C++; la guía de instalación explica cómo configurarlo en Windows, macOS y Linux.
Guarda el programa como hello.cpp, abre una terminal en esa misma carpeta y compílalo:
g++ hello.cpp -o hello
Si no se imprime nada, ha funcionado, y ahora hay un ejecutable llamado hello (hello.exe en Windows) junto al archivo fuente. Ejecútalo:
./hello
En Windows, ejecuta hello.exe o simplemente hello. En macOS, clang++ hello.cpp -o hello funciona igual, y allí g++ suele ser Clang con otro nombre.
Vale la pena añadir dos opciones desde el principio: -std=c++17 (o -std=c++20) elige el estándar del lenguaje, y -Wall -Wextra activa advertencias que detectan errores reales:
g++ -std=c++17 -Wall -Wextra hello.cpp -o hello
La página sobre compilar C++ explica qué hacen estas opciones, qué significa -o y por qué sin ella obtienes un archivo llamado a.out.
Primeros errores comunes
Los textos de error de abajo son de GCC (g++). Clang redacta sus mensajes de otra forma, pero señala la misma línea.
Falta un punto y coma.
hello.cpp:5:5: error: expected ';' before 'return'
El compilador solo nota que falta el ; cuando llega al siguiente token, así que el número de línea suele señalar la línea posterior al error. Revisa el final de la línea anterior.
Falta #include <iostream>.
error: 'cout' is not a member of 'std'
std::cout se declara en <iostream>. Añade el include al principio del archivo.
Falta std::.
error: 'cout' was not declared in this scope; did you mean 'std::cout'?
O escribes std::cout y std::endl, o añades using namespace std; después del include.
Main en lugar de main. C++ distingue mayúsculas de minúsculas. Un programa con int Main() compila, pero luego falla en la fase de enlazado con undefined reference to 'main', porque el enlazador no encuentra la función por la que debe empezar el programa.
Compilar con gcc en lugar de g++. gcc hello.cpp compila el código C++ pero no enlaza la biblioteca estándar de C++, así que obtienes una larga lista de errores undefined reference to std::.... Usa g++ (o clang++) para archivos de C++.
Comillas tipográficas. El código copiado de un procesador de textos o de una página web puede contener comillas tipográficas (“Hello”) en lugar de rectas ("Hello"). GCC informa stray '\342' in program. Vuelve a escribir las comillas en tu editor.
Encabezados antiguos y void main. Algunos tutoriales muy antiguos usan #include <iostream.h> o void main(). Ninguno de los dos es C++ estándar: el encabezado es <iostream> sin .h, y main debe devolver int. Los compiladores modernos rechazan ambos.
Imprimir con std::println en C++23
C++23 añadió una forma más corta de imprimir una línea, std::println, del encabezado <print>:
#include <print>
int main() {
std::println("Hello, World!");
}
Añade el salto de línea por ti y admite marcadores {} para los valores. El soporte llegó en GCC 14, en Clang 18 con libc++ y en las versiones recientes de Visual Studio, y requiere -std=c++23. La mayoría del código y de los tutoriales existentes siguen usando std::cout, así que conviene manejar bien las dos.
Preguntas frecuentes
¿Cómo se escribe Hola mundo en C++?
Empieza con #include <iostream>, define int main() y pon dentro std::cout << "Hello, World!" << std::endl;, seguido de return 0;. Guarda el archivo como hello.cpp, compílalo con g++ hello.cpp -o hello y ejecuta ./hello.
¿Por qué Hola mundo en C++ necesita #include <iostream>?
std::cout y std::endl se declaran en el encabezado <iostream>, no forman parte del lenguaje en sí. Sin el include, el compilador no conoce esos nombres y se detiene con un error como 'cout' is not a member of 'std'.
¿Cuál es la diferencia entre std::endl y '\n'?
Ambos terminan la línea. std::endl además vacía el buffer de salida, lo que obliga a que el texto salga de inmediato. '\n' solo escribe el salto de línea y deja que el stream se vacíe cuando le convenga, lo que es más rápido cuando imprimes muchas líneas. Para una sola línea de Hola mundo no hay diferencia visible.
¿Hace falta return 0 al final de main en C++?
No. main es la única función en la que C++ te deja omitir el return; llegar a la llave de cierre equivale a return 0;, que le indica al sistema operativo que el programa terminó bien. Mucha gente lo escribe de todos modos para dejar explícito el código de salida.