Como debe definirse la función "main"

Responder
Mensaje
Autor
Avatar de Usuario
rir3760
Mensajes: 7553
Registrado: 01/10/2004 11:00 pm
Ubicación: Mexico

Como debe definirse la función "main"

#1 Mensaje por rir3760 » 26/07/2012 2:24 pm

La función "main" es el punto de entrada cuando se ejecuta un programa. Debe definirse (sin indicar su prototipo) en una de las dos formas que se explican a continuación.


----


Sin parámetros. En este caso su definición debe ser la siguiente o una equivalente:

Código: Seleccionar todo

int main(void)
{
   /* Sentencias */
   
   return N; /* "N" es algun valor de tipo "signed int" */
}
Si la aplicación termina sin errores se debe retornar el valor 0 o EXIT_SUCCESS. En caso de error otro valor o EXIT_FAILURE. Ambas macros están definidas en el encabezado <stdlib.h>, el objetivo de su uso es indicar una salida normal o por error sin depender de la implementación.

Una definición equivalente es una donde se utilizan macros (mediante la directiva "define") o alias (mediante el uso de "typedef").

Por ejemplo:

Código: Seleccionar todo

#include <stdio.h>
#include <stdlib.h>

#define ENTERO  int
typedef void nada;

ENTERO main(nada)
{
   /* ... */
   
   return EXIT_SUCCESS;
}
Por supuesto si se define la función sin parámetros se debe tratar, en lo posible, de utilizar forma indicada (sin macros ni alias).


----


Con dos parámetros. En esta forma el primero debe ser de tipo "int" y el segundo de tipo "char **" (o su equivalente "char *[]"). Como en el primer caso se pueden utilizar formas equivalentes utilizando macros o alias. La definición clásica es:

Código: Seleccionar todo

int main(int argc, char *argv[])
{
   /* Sentencias */
   
   return N; /* "N" es algun valor de tipo "signed int" */
}
Los nombres "argc" y "argv" son los convencionales, si bien nada impide utilizar otros ello debe realizarse solo por razones de peso.

Con esta forma se tienen las siguientes garantías:

1) El valor de "argc" es no-negativo.

2) El valor de "argv[argc]" es NULL.

3) Usualmente el nombre de la aplicación puede accederse mediante la dirección indicada por "argv[0]", si ello no es posible el carácter "argv[0][0]" sera igual a '\0'.

4) Todas las cadenas apuntadas por "argv" pueden ser modificadas.

Un programa de ejemplo donde se muestra (mediante indices y aritmética de punteros) como procesar los parámetros de "main":

Código: Seleccionar todo

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{	
   int i;
   char **p;
   
   puts("Lista de argumentos (1):");
   for (i = 0; i <= argc; i++)
      printf(
         "argv[%d] == \"%s\"\n", 
         i, 
         argv[i] != NULL ? argv[i] : "NULL"
      );
   
   puts("----");
   
   puts("Lista de argumentos (2):");
   for (p = argv; p <= argv + argc; p++)
      printf(
         "argv[%ld] == \"%s\"\n", 
         (long int) (p - argv), 
         *p != NULL ? *p : "NULL"
      );
   
   return EXIT_SUCCESS;
}

----


¿Porque debe evitarse definir la función "main" en alguna otra forma?

Porque las dos indicadas son las únicas garantizadas por el estándar de C, si se utiliza alguna otra (no importa cual) su soporte depende del compilador utilizado.
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado