6.3 函数声明
函数声明也称函数原型。函数声明,用以通知编译器函数的存在,以获得函数的使用许可,只有这样才能在程序中对函数进行调用。
6.3.1 为什么要进行函数声明
函数声明描述了函数和编译器间的接口,想要调用一个函数,必须在调用函数中对被调用函数进行说明。
在代码6.1中,main()函数中的“int add(int x,int y);”用于在main()函数内声明add()函数,使其在main()函数内可用,同时告诉编译器,add()函数接收两个int型的输入参数,如果程序没有提供这样的参数,编译器便会指出错误,或对传入的其他类型参数进行隐式转换。
在add()函数完成计算后,将把返回值放置到指定位置(可能是CPU寄存器,也可能是某个内存单元),然后上级函数(代码6.1中为main()函数)从这个位置取得返回值,add()函数的声明指出了返回值类型为int,编译器借此知道应检索多少内存字节并对这些字节作出解释。图6.2形象化地说明了代码6.1中函数声明的作用和返回值机制。
函数声明也可以放在main()函数外部以使其在本程序中可见,这样便可以在程序的任何地方使用该函数,关于这部分的内容参见本章稍后的介绍。
有的读者可能会问:“编译器不能在程序代码中自行寻找函数的定义来决定如何对函数进行调用吗?”这样做会降低编译的效率,使得编译器在编译main()函数时要经常停下来,并且C++允许将程序代码放在多个文件中,编译器对每个文件单独进行编译,通过链接将编译后的文件组合成可执行的程序,也就是说,调用函数和被调用函数的定义可能不在同一个文件中,在对调用函数进行编译时,编译器可能无权访问被调用函数所在的文件(代码),因此,声明语句的存在就显得十分必要。
图 6.2 代码6.1对应的函数声明与返回值机制
在调用函数之前对函数进行定义可以免去函数声明这一步骤,但在很多情况下,函数的调用是相互交织的,这种方法并不可行。除了在调用函数中对被调用函数进行声明使其可用外,还可以在函数外部(不属于任何一个函数定义范围)对被调用函数进行声明,这样便可以在本程序的任何地方使用该函数。但是,如果程序由许多文件组成,在别的文件中使用该函数同样要进行声明,换言之,外部声明并不具有全局可见性,参见本章稍后关于作用域和可见性的内容介绍。