Forma estándar de definir la función sin parámetros main () en C

¿Cuál es la forma correcta, según el último estándar de C, para definir funciones sin parámetros: int main() o int main(void) ?

Ambas formas de definición son válidas (la que no tiene void es un prototipo no válido y una statement incompleta (aunque válida) ).

El formulario int main(void) { /* whetever */ } también proporciona un prototipo para la función.
El formulario int main() { /* whatever */ } no proporciona un prototipo (y el comstackdor no puede verificar si se llama correctamente).

Ver el Estándar (PDF)

6.7.5.3/14

Una lista vacía en un declarador de función que forma parte de una definición de esa función especifica que la función no tiene parámetros.

diferencia entre definición : int main() { /* whatever */ }
y statement : int main();
y prototipo : int main(void); .

La definición no proporciona un prototipo;
la statement es válida pero no especifica información sobre el número o los tipos de parámetros;
El prototipo está bien y es compatible con la definición.