El estándar especifica las siguientes definiciones de la función main:
int main();
int main(int argc, char* argv);
int main(int argc, char argv[]);
Las dós últimas son virtualmente idénticas pero definiendo de diferente manera un puntero a char.
Lógicamente con estas definiciones hay que retornar un valor numérico, que será 0 si el programa finaliza correctamente, y cualquier otro valor si el programa finaliza de una manera errónea o inadecuada
El resto de las formas que hay por ahí, como
void main()
void main(void)
main()
etc...
no siguen el estándar, y son incorrectas. Otra cosa es que los compiladores hagan lo que les sale de la brenca y te lo permitan, y por eso algunos dan warnings.
Puedes hacerlo como te de la gana,eso si, si luego el código no compila en otro compilador o en versiones posteriores pues a cambiarlo.