函数声明(函数原型)的一些关键技巧
当编译器遇到一个函数调用时,它产生代码传递参数并调用这个函数,而且接收该函数返回的值(如果有的话)。但编译器是如何知道该函数期望接受的是什么类型和多少数量的参数呢?如何知道函数返回值的类型呢?
如果没有关于调用函数的信息,编译器便假定在这个函数的调用时参数的类型和数量是正确的。同时会假定函数将返回一个整型值。对于那些返回值并非整型的函数而言,这种隐式认定常常导致错误。
这种情况,很容易解决,例如可以在调用该函数前定义这个函数,或者调用该函数前声明该函数(今后,函数声明又叫函数原型),解决的办法很多,但上面的两种都不是最好的,特别对于规模较大的程序。
下面介绍函数原型:
向编译器提供一些关于函数的特定信息显然更加安全,我们可以通过两种方法来实现。
首先,如果同一个源文件的前面已经出现了该函数的定义,编译器就会记住它的参数数量和类型,以及函数对的返回值类型。接着,编译器便可以检查该函数的所有后续调用(在同一个源文件中),确保它们是正确的。
第2种向编译器提供函数信息的方法是使用函数原型(function prototype)。原型总结了函数定义的起始部分的声明,向编译器提供有关该函数应该如何调用的完整信息。
使用原型最方便(且最安全)的方法是把原型置于一个单独的文件,当其他源文件需要这个函数的原型时,就使用#include 指令包含该文件。这个技巧避免了错误键入函数原型的可能性,它同时简化了程序的维护任务,因为这样只需要该原型的一份物理拷贝。
举个函数原型的例子:
int *find_int(int key, int array[], int len);
注意后面的那个分号;它区分了函数原型和函数定义的起始部分。
这个技巧(使用#include)比前一种方法的好处在于:
- 现在函数原型具有文件作用域,所以原型的一份拷贝可以作用于整个源文件;
- 如果函数的定义进行了修改,我们只需要修改原型,并重新编译所有包含了该原型的源文件即可;
- 如果函数原型同时也被#include指令包含到定义函数的文件中,编译器就可以确认函数原型与函数定义的匹配。
通过只书写函数原型一致,我们消除了多份原型的拷贝间不一致的可能性。然而,函数原型必须与函数定义匹配。把函数原型包含在定义函数的文件中可以使编译器确认它们之间的匹配。
文章来源: reborn.blog.csdn.net,作者:李锐博恩,版权归原作者所有,如需转载,请联系作者。
原文链接:reborn.blog.csdn.net/article/details/82287903
- 点赞
- 收藏
- 关注作者
评论(0)