C++ 函数';返回错误;s原型
为什么我们必须在C++ 函数';返回错误;s原型,c++,function,prototype,C++,Function,Prototype,为什么我们必须在main()函数之前使用原型 我在main()之后初始化自己的函数,并指定返回值的类型和输入参数的类型。为什么我必须在main()之前再做一次 我以为我可以用函数的原型更改返回值的类型和输入参数的类型,但我做不到!我明白了: /tmp/ccixLbJm.o:在函数“main”中: learn.cpp:(.text+0x1c):对“plusValue(double)”的未定义引用 collect2:错误:ld返回了1个退出状态 之后 #包括 使用名称空间std; 双加值(双值);
main()
函数之前使用原型
main()
之后初始化自己的函数,并指定返回值的类型和输入参数的类型。为什么我必须在main()
之前再做一次#包括
使用名称空间std;
双加值(双值);
int main(){
cout函数声明与其定义不一致
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;
}
#包括
double plusValue(double value);//函数声明
int main(){
cout函数声明与其定义不一致
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;
}
#包括
double plusValue(double value);//函数声明
int main(){
cout函数声明的用途是,您可以在函数定义可以调用之前声明一个函数,因为编译器已经知道它的返回类型以及它期望的参数。您的代码当前告诉编译器函数将有一个定义double plusValue(double value)
在代码的后面。然后你在main
中使用该函数,编译器会告诉你。它知道该函数接受一个double
,这就是你传递的。然后在main
之后定义一个函数plusValue
,它接受int
并返回一个int
,这与你刚才所做的声明。然后链接器试图找到double plusValue
的定义,但它找不到,然后你得到了一个很好的链接器错误。函数声明的用途是,你可以在函数定义调用之前声明一个函数,因为编译器已经知道它返回的是什么ype将是,它需要什么参数。您的代码当前告诉编译器,函数double plusValue(double value)将有一个定义
在代码的后面。然后你在main
中使用该函数,编译器会告诉你。它知道该函数接受一个double
,这就是你传递的。然后在main
之后定义一个函数plusValue
,它接受int
并返回一个int
,这与您刚才所做的声明。然后链接器尝试查找双加值的定义,但找不到它,然后您会得到一个很好的链接器错误。为了允许编译器在一次传递中解析代码,原型允许在知道完整定义之前为调用生成适当的代码,因为调用的生成只需要知道接口
如果定义出现在main()
之前,事实上不需要原型声明;以下内容同样有效:
#include <iostream>
double plusValue (double value)
{
return value + 1.0 ;
}
int main()
{
std::cout << plusValue(5.32) << std::endl ;
}
#包括
双加值(双值)
{
返回值+1.0;
}
int main()
{
std::cout为了允许编译器在一次传递中解析代码,原型允许在知道完整定义之前为调用生成适当的代码,因为生成调用只需要知道接口
如果定义出现在main()
之前,事实上不需要原型声明;以下内容同样有效:
#include <iostream>
double plusValue (double value)
{
return value + 1.0 ;
}
int main()
{
std::cout << plusValue(5.32) << std::endl ;
}
#包括
双加值(双值)
{
返回值+1.0;
}
int main()
{
STD::CUT你不必在C++中使用原型,BTW.但是为什么你想以后改变类型和返回值??在C中,你需要使用原型,这样编译器就知道在调用它之前有东西存在。C.C++的概念没有原型,它只有声明。@ KerrekSB,我认为原型与(完全)声明是一样的。你是说两者之间存在语义上的差异吗?还是你只是说C++语言/社区避免了使用“原型”这个词,而宁愿坚持“声明”。按照惯例?@ TasoPasaTyLyouou:我是说C++中没有这样的东西。在C中有两个不同的声明和原型概念。@ KerrekSB,基本上是在没有添加任何东西的情况下重新修改前面的语句!XD我会澄清:C的旧版本允许“部分”。声明,即省略参数的数量和类型。因此在c中,“原型”表示“完整”的声明,即指定参数数量和类型的声明。给定“部分”声明不是C++中的东西,不需要在原型和声明之间进行区分,因此我们根本不去理会前一个术语。“这是你的意思吗?还是我的理解有缺陷,有根本的区别?你不必在C++中使用原型,BTW.但是为什么你后来想改变类型和返回值??在C中,你需要使用原型,这样编译器就知道在你调用它之前有东西存在。”C.C++的概念没有原型,它只有声明。@ KerrekSB,我认为原型与(完全)声明是一样的。你是说两者之间存在语义上的差异吗?还是你只是说C++语言/社区避免了使用“原型”这个词,而宁愿坚持“声明”。按照惯例?“TasoPopasyLangouou:我是说C++中没有这样的东西。