El siguiente ha sido válido en C89
main() {
return 0;
}
Pero en C moderna (C99), esto no está permitido más porque hay que indicar explícitamente al tipo de variables y tipo de funciones volver, por lo que se convierte en
int main() {
return 0;
}
Además, es legal para omitir el return 0
en C moderno, por lo que es legal escribir
int main() {
}
Y el comportamiento es como si se devuelve 0.
La gente pone void
entre los paréntesis, ya que asegura verificación de tipos adecuada para las llamadas de función. Un conjunto vacío de paréntesis en C significa que no hay información sobre la cantidad y el tipo de los parámetros fuera de la función, y quien llama debe conocerlos exactamente.
void f();
/* defined as void f(int a) { } later in a different unit */
int main() {
f("foo");
}
La llamada a f
provoca un comportamiento indefinido, ya que el compilador no puede comprobar el tipo del argumento en contra de lo f
Espera en los otros módulos. Si se va a escribir con void
o con int
, el compilador sabe
void f(int); /* only int arguments accepted! */
int main(void) {
f("foo"); /* 'char*' isn't 'int'! */
}
Así que para main
es sólo un buen hábito de poner void
allí, ya que es bueno para hacerlo en otro lugar. En C puede llamar recursivamente al main
, en cuyo caso esas diferencias pueden ser importantes.
Lamentablemente, solo unos pocos compiladores son compatibles con la C moderna, por lo que en muchos compiladores de C es posible que aún recibas advertencias por el uso de funciones C modernas.
Además, puede ver programas para declarar main
para devolver cosas diferentes a int
. Tales programas pueden hacer eso si usan una implementación independiente C. Dichas implementaciones C no imponen ninguna restricción en main
ya que ni siquiera conocen ni requieren dicha función en primer lugar. Pero para tener una interfaz común y portátil para el punto de entrada del programa, la especificación C requiere programas estrictamente conformes para declarar main con el tipo de retorno int
, y requiere alojado en implementaciones C para aceptar dichos programas.
No. Por un lado, es C y no C++, y por otro, pregunta por qué se necesitan un tipo de datos y una declaración de retorno. – Zarel