为什么我们必须在main()
函数之前使用原型?
我在main()
之后初始化自己的函数,并指定返回值的类型和输入参数的类型。为什么我必须在main()
之前再多做一次?
我以为我可以用函数的原型改变返回值的类型和输入参数的类型,但是我不能这样做!我明白了:
/tmp/ccixLbJm.o:在函数'main'中: learn.cpp :(。text + 0x1c):对'plusValue(double)'的未定义引用 collect2:错误:ld返回1退出状态
后
#include <iostream>
using namespace std;
double plusValue(double value);
int main () {
cout << plusValue(5.32) << endl;
}
int plusValue (int value){
value++;
return value;
}
那么,为什么我们必须使用这些原型,如果它不让我们改变返回和输入值并且它们在main()
之后指定的相同?
答案 0 :(得分:1)
函数声明与其定义不相同。
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 ++文件进行单独的编译和过程。
答案 1 :(得分:1)
为了允许编译器一次性解析代码,原型允许在知道完整定义之前为调用生成适当的代码,因为调用的生成只需要知道界面。
如果定义出现在main()
之前,事实上不需要原型声明;以下内容同样有效:
#include <iostream>
double plusValue (double value)
{
return value + 1.0 ;
}
int main()
{
std::cout << plusValue(5.32) << std::endl ;
}
原型声明的真正好处是它们允许单独的编译和链接,其中定义可以在与使用它的单独的翻译单元中,通常在头文件中声明。
答案 2 :(得分:0)
函数声明的用法是你可以在函数定义可以调用之前声明一个代码函数,因为编译器已经知道它的返回类型是什么以及它期望什么参数。您的代码当前告诉编译器稍后将在代码中定义函数double plusValue(double value)
。然后在main
中使用该函数,这样编译器就可以了。它知道函数需要double
,这就是你传递的内容。然后在main
之后定义一个函数plusValue
,它接受一个int
并返回一个int
,这与您刚刚做出的声明完全不同。然后链接器尝试找到double plusValue
的定义,它找不到它,然后你得到一个很好的链接器错误。