La Norma C11 declara que:
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 de
int
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; 10) , o de alguna otra manera definida por la implementación.
10) Por lo tanto, int se puede reemplazar por un nombre
typedef
definido comoint
, o el tipo deargv
se puede escribir comochar ** argv
, y así sucesivamente.
Ignoraremos esta parte: o de alguna otra manera definida por la implementación. ya que solo estoy interesado en definiciones equivalentes a los dos ejemplos anteriores.
¿Sería esta una definición válida para main ya que char* a[4]
y char**
son equivalentes?
int main(int argc, char* argv[4]){/*...*/}
¿Qué tal una matriz VLA? Asumimos que printf
devolverá un valor int positivo:
int main(int argc, char* argv[printf("Hello there!")]){/*...*/}
Sí, todo esto está cubierto por el "o equivalente". La nota al pie sobre el cambio de nombre de los parámetros o el uso de tipos typedef
por tipo son solo ejemplos.
Mi variante favorita es
int main(int argc, char* argv[argc+1]){/*...*/}
porque tiene la mayor cantidad de información sobre la semántica de todas las funciones main
.
int main(int argc, char* argv[4]){/*...*/}
es una firma válida de main
. El compilador ignorará 4
en char argv[4]
y es equivalente a char argv[] = char **argv
. Lo mismo ocurre con la segunda firma.