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()
    之前再做一次

  • 我以为我可以用函数的原型更改返回值的类型和输入参数的类型,但我做不到!我明白了:

    /tmp/ccixLbJm.o:在函数“main”中: learn.cpp:(.text+0x1c):对“plusValue(double)”的未定义引用 collect2:错误:ld返回了1个退出状态

    之后

    #包括
    使用名称空间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++中没有这样的东西。