rir3760

Registrado: 01 Oct 2004 Mensajes: 7517 Ubicación: Mexico
| Publicado: 26/07/2012 2:24 pm | | | Título: Como debe definirse la función "main" |
| 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: | 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: | #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: | 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: | #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 |
|