5.1.2.2.1 プログラム開始処理 プログラム開始処理において呼び出される関数の名前は,main とする。処理系は,この関数に対して関数原型を宣言しない。この関数は,次の4種類の方法のいずれかで定義しなければならない。
− 返却値の型 int をもち仮引数をもたない関数
      int main(void) { /* ... */ }
− 二つの仮引数をもつ関数(仮引数は,これらが宣言された関数に対して局所的であるため,どのような名前を使用してもよいが,ここでは argc 及び argv とする。)
      int main(int argc, char * argv[]) { /* ... */ }
− 上に掲げた二つの方法のいずれかと等価な方法
− 上に掲げた三つの方法のいずれでもない処理系定義の方法


int main()は「三つの方法」のいずれでもないので「処理系定義の方法」
つまり移植性がない、動かないコンパイラがあったとしても文句は言えない
一方int main(void)を弾くコンパイラは標準準拠してる限りあり得ないし、あったとしたら堂々と文句が言える
わざわざ移植性のない書き方をする理由がない