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;
}