你看编译器的行为:它是扫描你的代码文本,从上到下,发现了int f();这一行函数声明,是没有问题,因为函数声明就是这样;然后它发现了一个花括号代码块,然而这个代码块是不包含在某个函数体之中的,所以给你报告说缺了函数的定义头(相当于main()函数中缺了void main()那一行);一但发现这个错误,后面的就完全不用看了,必定是被这个语法错误搅乱的。你排错的时候,先解决编译信息中第一个出现的问题,不要看后面的东西,逐个解决,解决了前面,后面的顺带就会修复,若去看后面的,多数误导你。
gcc的报错信息,只是说缺了(或{括号,但没有指出问题的本质。事实上这个问题不是缺括号的问题,而是缺了函数定义头的问题。