訂正
× int ((*foo(void))(void))
○ int (*(*foo(void))(void))

でした、すみません。
>>675
ちなみに上の書き方はなんかおかしいですね。
確かに、 int *(*foo(void))(void) のほうが正しそうです
(厳密にはどうなのか分からないところが悲しい・・・調べます。
・・・でも自分のは間違ってないか?動いてたけど)。
しかし 675 のをコンパイルしても、同じエラーが出ます。

「式は引数リストのない関数に対して評価します」って warning は
「関数実行しようとしてんのに、引数がねぇんだよ!!」
ってことだと思うので、(とかいいながら実行すると関数のアドレスを返してくれるから謎)
「ちがうよ、関数のアドレスを返してるだけなんだよ」
っていうキャストが必要なんじゃないかと思うのですが、
考えてみると、foo 関数の宣言から明確にそのことが分かるから・・・
つまり自分の認識が間違ってる?それともコ(ry

>>673
多重定義になるのでは?というか多分良く分かってません。どういうことでしょう?

void* にキャストするのは非常に嫌なのですが、
ぐぐったらそれっぽい記述があったのでしてみました
(スレ違いですが、VC6に関してはOKなのかな)。
個人的にはこっちのほうが warning じゃない?と思ってしまいます。