C语言规定,标识符必须先声明后引用。引用未经声明或者类型(如果有的话)和声明不符的标识符属于语法错误。函数名是描述有类型对象的标识符,函数调用是对函数名的引用,因此函数调用之前必须声明,否则编译器会报错。
但是要注意,函数的定义本身即包含了声明。而编译器对于一个编译单元(已经经过预处理)内的编译顺序是自前向后的,因此结论是如果调用之前函数已经定义,那么不用写额外的声明(要是再次声明的话,只要函数参数列表类型和定义的一致,也不会引起编译错误);如果定义的函数体在调用之后,那么必须先声明才能调用。
另外的一种情况是,函数的定义不在源文件而在外部库文件中,这时调用前也需要先声明(C标准库头文件里面有这样的声明)。
注意一旦声明,就必须要有定义。否则编译过程的最后链接器会报错,提示未解析的引用(也就是“找不到定义”)。
从编译的角度来说,声明是对编译器的提示,使编译器在解析标识符引用时类型验证等语法检查工作不必搁置起来占用内存,或者在后续代码中查找定义消耗额外时间。这点对于早期硬件条件吃紧的环境下的编译效率有重要意义。但是随着硬件条件的改善,这个特性的优势已经变得不是那么明显,反而加重程序员的负担。相对于C/C++,一些更“现代”的类C语言(Java、C#、D语言等)中不再有“先声明后引用”的限制。
====
[原创回答团]
参考资料:原创
本回答被提问者采纳