¿Qué debe devolver main() en C++? Comparación con C y estándares

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción: La pregunta principal que incluso los profesionales se hacen

\n\n

¿Alguna vez te has preguntado por qué cada programa en C++ comienza con int main() y no con void main()? ¿Y qué sucede realmente cuando escribes return 0? Esta pregunta es un verdadero éxito en Stack Overflow, con miles de visitas y cientos de comentarios. Parece un tema elemental, pero esconde toda una capa de sutilezas que separan a C y C++, así como a principiantes y desarrolladores experimentados.

\n\n

En este artículo no solo daremos una respuesta seca. Realizaremos una comparación de enfoques en C y C++, analizaremos los estándares, mostraremos ejemplos de código reales y explicaremos cómo trabajar correctamente con el valor de retorno de main() para que tu código no solo sea funcional, sino también portable. Si estás aprendiendo C++ o escribes en él a diario, este artículo es para ti.

\n\n

Respuesta corta: ¿Qué debe devolver main() en C++?

\n\n

Si tienes prisa, aquí está la esencia: la función main() en C++ debe devolver int. Este es un requisito estricto del estándar (desde C++98 hasta C++23). El valor de retorno informa al sistema operativo si el programa finalizó correctamente.

\n\n

Aquí tienes el código mínimo correcto:

\n\n
#include <iostream>\n\nint main() {\n    std::cout << "¡Hola, Mundo!" << std::endl;\n    return 0; // Finalización exitosa\n}
\n\n

Pero esto es solo la punta del iceberg. Profundicemos.

\n\n

¿Por qué int y no void? Contexto histórico

\n\n

En las primeras versiones de C (antes del estándar ANSI C), el tipo de main() no estaba estrictamente definido. Muchos compiladores permitían escribir void main(), y funcionaba. Sin embargo, con la llegada de la estandarización (C89/C90 para C y C++98 para C++), se decidió que main() debía devolver un código de finalización al sistema operativo.

\n\n

¿Por qué? Porque los scripts, los Makefiles y otros programas a menudo verifican cómo finalizó tu proceso. El código de retorno 0 significa "éxito", y cualquier valor distinto de cero significa "error" (o un tipo específico de error). Si main() fuera void, no podrías transmitir esta información.

\n\n

En C++, la situación es aún más estricta. El estándar de C++ (sección [basic.start.main]) dice explícitamente: main() debe ser de tipo int. Cualquier otra declaración (por ejemplo, void main()) es una extensión del compilador y hace que el código no sea portable.

\n\n

Comparación de C y C++: ¿Cuál es la diferencia?

\n\n

Aunque ambos lenguajes requieren int main(), hay varias diferencias clave:

\n\n
    \n
  • Return 0 implícito en C++: Si no escribes return al final de main(), C++ inserta automáticamente return 0. En C (a partir de C99) esto también funciona, pero en estándares antiguos (C89) la ausencia de return provocaba un comportamiento indefinido.
  • \n
  • Argumentos de línea de comandos: En C++ puedes declarar int main(int argc, char* argv[]) o int main(). En C también existe una tercera opción con el entorno (char* envp[]), pero en C++ no está estandarizada (aunque muchos compiladores la soportan).
  • \n
  • void main(): En C, algunos compiladores (por ejemplo, para sistemas embebidos) pueden permitir void main(). En C++, esto es un error grave y el código no se compilará en modo estricto.
  • \n
\n\n

Ejemplo para C++ (funciona siempre):

\n\n
int main() {\n    std::cout << "C++ devolverá automáticamente 0" << std::endl;\n    // return 0; // se puede omitir\n}
\n\n

Ejemplo para C (requiere return explícito en estándares antiguos):

\n\n
#include <stdio.h>\n\nint main() {\n    printf("En C89 es necesario devolver explícitamente 0\\n");\n    return 0; // obligatorio\n}
\n\n

¿Qué significan los códigos de retorno? Análisis con ejemplos

\n\n

El código de retorno es un

Blogs

Book Recommendations