>>130
関数に引数がないということと、
関数呼び出し時に引数の型や数のチェックが行われるかどうかは別だよ。

foo() は、Declarators の Syntax から空の identifier-list を持つ関数と解釈される。
この場合は、関数呼び出し時に仮引数と実引数の数が一致しない場合は呼び出し自体は有効だが、動作不定。
一方、foo(void) は、void が declaration-specifiers となる関数と解釈される。
この場合は、関数呼び出し時に厳密に引数の型や数がチェックされる。
よって、>>127 のコンパイラは正しく動作しているし、foo() != foo(void)。
main の件もスタートアップルーチンからの呼び出しだから、
型や数のチェックが行われていないだけじゃないかな。
だから、スタートアップルーチンから引数を渡されたら動作不定でしょ。