C ++尚未定义的调用函数

时间:2016-02-05 16:40:47

标签: c++

我有这个代码。如何在不创建错误的情况下执行此操作?

int function1() {
    if (somethingtrue) {
        function2();
    }
}

int function2() {
    //do stuff
    function1();
}

8 个答案:

答案 0 :(得分:8)

这是前瞻性声明的案例。前向声明告诉编译器该名称将存在,它的类型是什么,并允许您在定义它之前在有限的上下文中使用它。

int function2();  // this lets the compiler know that that function is going to exist

int function1() {
    if (somethingtrue) {
        function2(); // now the compiler know what this is
    }
}

int function2() { // this tells the compiler what it has to do now when it runs function2()
    //do stuff
    function1();
}

答案 1 :(得分:3)

使用forward declaration。您可以在使用之前声明一个函数,只需编写其签名,然后使用分号。有了这个,你向编译器保证在其他地方会有一个具有相同签名的函数定义。

int function2();

int function1() {
    if (somethingtrue) {
        function2();
    }
}

int function2() {
    //do stuff
    function1();
}

答案 2 :(得分:2)

将它放在你的功能之上:

int function1();
int function2();

但不要创造无限循环! 使用这两行,您告诉编译器将来function1function2定义。在较大的项目中,您将使用头文件。你也可以这样做,但可以在多个文件中使用这些功能。

也不要忘记退货声明。我认为你的代码示例只是演示,但我只想提一下。

在C ++中,您必须单独声明和定义。 在此处阅读更多相关信息:https://stackoverflow.com/a/1410632/4175009

答案 3 :(得分:1)

首先声明第二个函数,因此它可以看到它的存在。

int function2();

int function1() {
    if (somethingtrue) {
        function2();
    }
}

int function2() {
    //do stuff
    function1(); //beware of double recursion.
}

答案 4 :(得分:1)

int function2();

int function1() {
    if (somethingtrue) {
        function2();
    }
}

int function2() {
    //do stuff
    function1();
}

这称为前向声明。您让编译器知道有一个名为function2()的函数,而不是定义它。这足以让编译器在function1()内调用该函数时插入该函数,然后在链接时解析该函数​​。

答案 5 :(得分:1)

转发声明功能2()。

int function2(); //forward declaration

int function1() {
    if (somethingtrue) {
        function2();
    }
}

int function2() {
    //do stuff
    function1();
}

答案 6 :(得分:1)

这将解决您的问题:

int function2();

int function1() {
    if (true) {
        function2();
    }
}

int function2() {
    //do stuff
    function1();
}

答案 7 :(得分:0)

通常的做法是先声明你的函数。 一般约定是将声明放在*.h 文件中,定义放在*.cpp 文件中。 然后在 *.cpp 文件中包含 *.h 文件。 这样您也可以在其他文件中使用 function1 和 function2,而无需重复声明。您只需在其他文件中包含 functions.h。

// functions.h
int function1();
int function2();

// functions.cpp
#include "functions.h"

int function1() {
    if (somethingtrue) {
        function2();
    }
}

int function2() {
    //do stuff
    function1();
}

但是,如果您有很多功能并且想要快速而肮脏的解决方法,您可以这样做:

class Root{public:

    int function1() {
        if (somethingtrue) {
            function2(); /// That will work now
        }
    }

    int function2() {
        //do stuff
        function1();
    }

    /// You can also put here variables, structs, classes, etc.
    /// and they will see each other regardless of order in code.

    /// But don't put main here
    /// it won't work

} root;

/// but now to call functoin1 or function2 from outside we need to use root
void main(){
    root.function1();
}

Rootroot 只是这里的一个例子。您可以使用任何未使用的类名和变量名。