Después de investigar con expertos en la materia, programadores de varias áreas y maestros hemos dado con la respuesta al dilema y la compartimos en este post.
Solución:
- Se necesita una declaración de una función solo antes de que se use una función. La definición es en sí misma una declaración, por lo que no se requiere ningún prototipo previo. (Algunos compiladores y otras herramientas pueden advertir si una función se define sin un prototipo previo. Esto pretende ser una guía útil, no una regla del lenguaje C).
- Porque el estándar C lo dice. Los sistemas operativos pasan el valor devuelto al programa que llama (generalmente el shell). Algunos compiladores aceptarán
void main
pero esta es una extensión no estándar (generalmente significa “siempre devolver cero al sistema operativo”). - Por convención, un valor de retorno distinto de cero indica que se produjo un error. Los scripts de shell y otros programas pueden usar esto para averiguar si su programa terminó con éxito.
1) Todas las funciones deben estar declaradas en su prototipo de función y, posteriormente, en su definición. ¿Por qué no tenemos que declarar primero la función main() en un prototipo?
No true. Ejemplo sencillo:
void foo() //definition
int main()
foo();
return 0;
Solo cuando se llama a una función pero aún no se ve la definición, se requiere una declaración. eso nunca le pasara main
ya que es el starup del programa.
2) ¿Por qué tenemos que usar int main() en lugar de void principal()?
Porque la norma lo dice. (Para ser más precisos, es true en un entorno alojado, que suele ser el caso)
C99 5.1.2.2.1 Inicio del programa
La función llamada al inicio del programa se llama
main
. La implementación no declara ningún prototipo para esta función. Se definirá con un tipo de retorno deint
y sin parámetros:int main(void) /* ... */
o con dos parámetros (referidos aquí como
argc
yargv
aunque se puede usar cualquier nombre, ya que son locales a la función en la que se declaran):int main(int argc, char *argv[]) /* ... */
o equivalente; o de alguna otra manera definida por la implementación.
3) ¿Qué hace exactamente return 0 en la función main()? ¿Qué pasaría si escribiera un programa que termina la función main() con return 1, por ejemplo?
El valor de retorno indica el resultado del programa. Normalmente 0
indica éxito mientras que otros valores indican diferentes tipos de fracaso.
No eres libre de elegir el tipo de devolución de main porque no escribiste el código que llama a main. El código que llama a main ya existía antes de que siquiera pensaras en aprender C. Fue escrito por las personas que proporcionaron el Código de inicio de tiempo de ejecución de C, que generalmente se vincula automáticamente a su ejecutable sin que usted lo sepa. Este código a menudo reside en un archivo llamado crt0.o (creado a partir de crt0.co incluso ensamblador en crt0.s). Espera usar un valor de retorno que indique éxito (0) o falla (distinto de cero), además de posiblemente otra información como si el código terminó debido a una señal y, de ser así, cuál. Estos son fragmentos de la historia de Unix, que no repetiré aquí 🙂
Reseñas y puntuaciones
Si haces scroll puedes encontrar las crónicas de otros programadores, tú de igual manera puedes insertar el tuyo si te gusta.