Es opcional el segundo (el que se pasa como parámetro a
main), ¿por qué? porque el estándar indica que, en ausencia de tipo de dato se asume
void (en C++, no recuerdo en C pero ya debería ser igual
). En cuanto al primer void, ya no se usa, el estándar ahora indica que la función
main devuelve un
int, es decir, usarías algo como esto:
int main() {
...
return 0; // no olvidemos devolver el int :)
// o también así:
// return EXIT_SUCCESS;
}