为什么我们必须在 main()
函数之前使用原型(prototype)?
我在
main()
之后初始化了我自己的函数,并且我指定了返回值的类型和输入参数的类型。为什么我必须在main()
之前再做一次?我以为我可以用函数的原型(prototype)改变返回值的类型和输入参数的类型,但我做不到!我明白了:
/tmp/ccixLbJm.o: In function 'main': learn.cpp:(.text+0x1c): undefined reference to 'plusValue(double)' collect2: error: ld returned 1 exit status
之后
#include <iostream> using namespace std; double plusValue(double value); int main () { cout << plusValue(5.32) << endl; } int plusValue (int value){ value++; return value; }
那么,如果它不允许我们更改返回值和输入值并且它们在 main()
之后指定的都是相同的,那么我们究竟为什么必须使用这些原型(prototype)?
最佳答案
函数声明与其定义不相等。
double plusValue(double value)
不等于
int plusValue (int value)
代码应该是这样的
#include <iostream>
double plusValue(double value); // function declaration
int main () {
cout << plusValue(5.32) << endl;
}
double plusValue(double value){ //function definition
value += 1;
return value;
}
总结评论,我们必须在使用它之前声明我们的函数。函数声明告诉编译器函数返回值以及参数的数量和类型。没有这些信息,编译器就不知道如何与我们的函数交互(交互意味着将参数传递给堆栈并获取返回值)。还需要函数定义,函数定义是函数实际的可执行体,所以你必须定义它,但不一定要在你声明的文件中定义。您可以在另一个文件或库中定义函数。
如果你不声明一个函数并定义它,编译器会为你隐式声明它,一些编译器需要在使用该函数之前声明(或隐式声明),所以如果你只想定义函数而不用声明它,您必须在使用该函数之前放置定义。
正如 Clliford 所说,将函数声明与其定义分开的真正好处是针对不同的 C/C++ 文件进行单独的编译和过程。
关于c++ - 函数原型(prototype)返回错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41202317/