第7章:函数--C++的编程模块

探讨为什么需要函数原型:

// 1.cpp

// 功能:计算两个数的和
int sum(int a, int b)// 函数头
{                    // 花括号围起来的是函数体
    int c = a + b;
    return c;
}
// 2.cpp
int sum(int a, int b);// sum函数原型
int main()
{
    int d = sum(1,2);// 调用sum函数
    return 0;
}
  • 调用函数的时候,为什么需要知道函数头
    • 函数头,描述了接受参数的个数和类型,以及返回值的类型。
    • 函数调用的过程是,首先主调函数向被调函数发送数据,把参数传给被调函数,被调函数收到后,执行自己的代码,处理完成后,向主调函数发数据,把返回值传给主调函数。 数据在计算机中是一串二进制数字,必须指明它的类型,接受方才能理解数据的真实含义。函数头指明了,函数通讯的过程中数据的类型。
  • 2.cpp中调用sum函数,为什么编译器不直接去查看1.cpp中的函数头,而是需要程序员手写提供sum函数原型。
    • 因为C语言支持单独编译,所以.cpp文件不能相互依赖,相当于cpp间,互不可见。编译器在编译2.cpp文件时,无权查看1.cpp的任何内容。
    • C语言编译的过程:首先C编译器把.cpp文件分别编译成.o的二进制文件,然后C连接器把所有的.o文件链接成可以执行的.exe文件。
    • C编译器每次单独编译1个.cpp文件,例如编译2.cpp的时候,并不赖1.cpp中的任何内容。C编译器,发现sum函数调用时,首先尝试在当前cpp中寻找sum函数的定义,发现没有找到,那么编译器就会猜测这个函数可能定义在其他的.cpp中,然后根据函数原型的提示,留下对应的空洞,用来存放函数的地址,继续编译下面的代码,形成1.o文件。然后C连接器根据函数名称,在所有的.o文件中查找匹配的函数,找到后,在预留的空洞上填上真实函数的地址。

猜你喜欢

转载自www.cnblogs.com/xshh/p/12420582.html