随便举个例子
你在一个编译单元(相当于一个.c文件中),这样写
int main()
{
float a = foo( 1 );
}
编译器该怎么编译这个文件呢?
是压入一个int型的1,还是压入一个long型的1,还是压入一个double型的1,……?
对于返回值,是当成float看待呢?还是当成int看待,然后转化为float类型,……?
这些不能确定的话,就无法编译。
假如你当成 float foo( int ); 看待,哪知道另一个.c中是如下定义的,那就牛头不对马嘴
char foo( char c )
{
return c;
}
不同编译单元因为信息不共享,所以函数必须先声明才可以使用。而对于同一个编译单元,如果允许不声明,那编译时就得扫描两遍,第一个用来确定函数原型,这样的话,编译时间就浪费很多,所以C/C++要求必须提前声明(极度古老的C就不谈的,因为那时只有一个类型int,所以声明不声明都一样,也就是默认类型都是int)。