función main () en C


He estado aprendiendo programación en C de manera autodidacta durante algunas semanas, y hay algunas preguntas que tengo sobre la función main().

  1. Todas las funciones deben ser declaradas en su prototipo de función, y más tarde, en su definición. ¿Por qué no tenemos que declarar la función main() en un prototipo primero?

  2. ¿por Qué tenemos que usar int main() en lugar de void main()?

  3. ¿Qué hace exactamente return 0 en la función main()? Lo que sería sucede si escribí un programa que termina la función main() con return 1;, por ejemplo?

 23
Author: unwind, 2013-08-26

8 answers

  1. Necesita una definición o un prototipo para llamar correctamente a una función, pero main nunca debe ser llamado desde ninguna otra función, por lo que no debe ser declarado.
  2. Porque el estándar C lo dice. Los sistemas operativos pasan el valor devuelto al programa que llama (normalmente el shell). Algunos compiladores aceptarán void main, pero esta es una extensión no estándar (normalmente significa "siempre devolver cero al sistema operativo").
  3. Por convención, un valor de retorno distinto de cero indica que se ha producido un error. Los scripts de shell y otros programas pueden usar esto para averiguar si su programa terminó con éxito.
 19
Author: Fred Foo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-26 14:49:53

1) Todas las funciones deben ser declaradas en su prototipo de función, y más tarde, en su definición. ¿Por qué no tenemos que declarar primero la función main() en un prototipo?

No es cierto. Ejemplo simple:

void foo(){}  //definition

int main()
{
    foo();
    return 0;
}

Solo cuando se llama a una función pero la definición no se ve todavía, se requiere una declaración. Eso nunca le sucederá a main ya que es el inicio del programa.


2) ¿Por qué tenemos que usar int main () en lugar de void main()?

Porque la norma lo dice. (Para ser más precisos, es cierto 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 aplicación declara no prototipo para esta función. Se definirá con un tipo de retorno de int y no parámetros:

int main(void) { /* ... */ }

O con dos parámetros (referidos aquí como argc y argv, aunque cualquier nombre puede ser se utilizan, 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 terminara la función main() con return 1, por ejemplo?

El valor devuelto indica el resultado del programa. Normalmente 0 indica éxito mientras que otros los valores indican diferentes tipos de fallo.

 16
Author: Yu Hao,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-14 17:07:52

No es libre de elegir el tipo de retorno de main porque no escribió 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 la gente que proporciona el código de inicio de tiempo de ejecución C, que generalmente se vincula automáticamente a tu ejecutable sin que lo sepas. Este código a menudo reside en un archivo llamado crt0.o (creado a partir de crt0.c o incluso ensamblador en crt0.s). Espera utilizar un valor devuelto que indique success (0) o failure (distinto de cero), además de posiblemente otra información como si el código fue terminado debido a una señal y si es así, cuál. Estos son bits de la historia de Unix, que no voy a repetir aquí: -)

 2
Author: Jens,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-26 15:03:47

1) No necesariamente; una definición también sirve como una declaración. En segundo lugar, solo hay unas pocas firmas válidas para main de todos modos, y normalmente no llamarás a main dentro de tu código a menos que estés escribiendo una entrada para el IOCCC.

2) Respuesta corta: porque la definición del lenguaje lo dice. Respuesta más larga: así es como su programa indica éxito o fracaso al entorno host. Una implementación individual es libre de admitir firmas adicionales para main, pero debe documente esas firmas adicionales. Si la documentación de su compilador no lista void main() como una firma legal, entonces no debería usarla.

3) Por convención (al menos en los sistemas *nix donde C se usó por primera vez), un estado de 0 indica éxito, y un estado distinto de cero indica ... algo más que el éxito. Exactamente qué valor corresponde a qué estado depende de la implementación.

 1
Author: John Bode,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-26 14:45:34

1) es false, solo puede crear la definición de una función.

2) podemos saber si la función main () termina correctamente

3) lo mismo excepto que en su shell se escribirá 1 en lugar de 0

 0
Author: jambono,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-26 14:41:42

1.La función main() es llamada implícitamente por la biblioteca C reconociendo la palabra clave incorporada 'main'. Así que no necesitamos declarar un prototipo para la función principal .

2.Esto no estoy seguro, pero creo que depende del tipo de editor utilizado . En Turbo C, void main () será aceptado, mientras que en dev-cpp main () debería devolver un valor.

3.return 0 simplemente sale del programa con el estado de salida 0 , en otras palabras, el valor de retorno determina el estado de salida del hilo principal.

 0
Author: Mahalakshmi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-26 14:51:50

En pocas palabras, la mayor esencia para todas sus preguntas son las tradiciones y la conformidad. Las cadenas de herramientas, los sistemas operativos, etc. saben que este procedimiento llamado main(), debe ser llamado primero desde el espacio de código del usuario (programa)...

Ahora específicamente: 1) Debido a la conformidad como dije. No necesita declarar porque las cadenas de herramientas y los sistemas operativos ya conocen main. También hay otras funciones de conformidad como exit ().

2) Cuando el main vuelve algún tiempo entonces el sistema operativo puede tener el resultado de nuevo de él. Normalmente no cero significa error. Así que cuando U está usando scripts u otros programas que llaman a su programa, por ejemplo, la función main (), puede comprobar si tuvo éxito.

3) Devolver algo más que cero significa error. Pero en realidad se puede interpretar ese valor como lo desea. Pero como he dicho OS puede tener el resultado.

Información Adicional: main() no es en realidad LA PRIMERA función (que has escrito) que se llamará cuando inicia el programa. PERO en realidad los sistemas operativos y las cadenas de herramientas facilitan otras llamadas antes de su principal, para configurar el entorno, hacer la inicialización o lo que sea. Pero usted no sabe sobre eso directamente cuando está escribiendo su código y no tiene que lidiar con eso y pensar en eso en absoluto. En los sistemas embebidos generalmente habrá algunas funciones de muy bajo nivel llamadas para configurar el reloj principal de la CPU, interrupciones, pila, etc. Algunas de las cadenas de herramientas como IAR realmente pueden permitirle ejecuta tu propio código antes de llamar a main.

Espero que esto haya ayudado :)

 0
Author: arapEST,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-26 15:11:01

Las funciones no tienen que declararse necesariamente primero como prototipo. Tal declaración solo es necesaria si necesitamos usar una función antes de que se defina.

Main tiene el tipo int por definición.

El significado del valor devuelto por main es convencional. La convención generalmente aceptada es que 0 se considera éxito, y no 0 algún tipo de fracaso.

 0
Author: zentrunix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-26 15:38:13