Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;换行多次返回_C++_Function_Return - Fatal编程技术网

C++ C++;换行多次返回

C++ C++;换行多次返回,c++,function,return,C++,Function,Return,我有以下代码,它在许多行中返回错误: bool func() { if (acondition) { return 0; } return 1; } int cmdfun() { other_funcs; if (func()) return ERROR#NUMBER; other_funcs; if (func()) return ERROR#NUMBER; } 但我发现它变得越来越长。如何将返回错误#NUMB

我有以下代码,它在许多行中返回错误:

bool func()
{
    if (acondition)
    {
        return 0;
    }
    return 1;
}

int cmdfun()
{
    other_funcs;
    if (func()) return ERROR#NUMBER;
    other_funcs;
    if (func()) return ERROR#NUMBER;
}

但我发现它变得越来越长。如何将返回错误#NUMBER也封装到func()中?或任何封装if(func())返回错误的方法;进入另一个独立的函数?

您不能单独使用
return
来实现这一点

但是您可以
func
中抛出一个异常,该异常将在调用堆栈中冒泡,就像您希望程序控制那样:

struct myexception{}; /*ToDo - inherit from std::exception?*/
bool func()
{
    if (acondition){
        return 0; /*normal behaviour, perhaps make `func` void if not needed?*/
    }
    throw myexception();
}
cmdfun
然后采用以下形式:

int cmdfun()
{
    other_funcs;
    func();
    other_funcs;
    func();
    /* don't forget to return something*/
}

最后,请确保
捕捉到
cmdfun

调用方中的异常。如果我正确理解了您的问题,您是在为自己的错误请求“错误报告者”。针对两种不同的情况,有两种解决方案:

案例1-您仍然希望使用return语句生成“error reporter”:

要做到这一点,您必须创建另一个函数,或者只是学习如何使用goto。但是,您不需要-您的函数返回一个布尔值(bool)-这意味着您只有两个可能的结果:0(False)和1(True)

但我认为第二种情况更有趣(不幸的是,作为一个初学者,它也很难理解,第一种解决方案对你来说可能容易得多):


案例2-您决定以其他方式进行操作-这是通过学习投掷和捕获-我不会重复答案,因为已经给出了:@Bathsheba回答了preety good…

正如我所说的,这不是异常,不能由std::exception处理,它只是一条错误消息,错误号只是另一个宏。我无法访问cmdfun()的调用方。因此无法采纳第一个答案。但在询问其他人后,可以封装返回并在键入返回时节省时间,虽然不建议这样做,但在这种特殊情况下,我可以使用宏。下面给出了一个完整的示例:

#include <iostream>
using namespace std;

#define CHECK_VEC(acondition)\
if(checkcondition(acondition)) return -1;

bool checkcondition(bool acondition)
{
    if (acondition) return 1;
    return 0;
}

int fun_called_by_main()
{
    int a = 5 + 4;
    bool acondition = a;
    CHECK_VEC(acondition);

    return 1;
}


int main()
{
    int a = fun_called_by_main();

    cout << a << endl;

    cin.get();
    return 0;
}
#包括
使用名称空间std;
#定义检查向量(条件)\
if(checkcondition(acondition))返回-1;
布尔检查条件(布尔条件)
{
如果(条件)返回1;
返回0;
}
int fun_被_main()称为
{
INTA=5+4;
布尔条件=a;
检查车辆(条件);
返回1;
}
int main()
{
int a=fun_被_main()调用;

为什么不使用为这种情况设计的异常呢?@πάνταῥεῖ 它是关于封装调用堆栈的返回,如func()->cmdfun()->main(),以便func()可以直接将错误返回到main(),因此无需将返回错误放入cmdfun()。您不能像前面提到的那样封装返回使用异常。@πάνταῥεῖ 但这也不例外。它只是双重返回和封装返回。好吧,如果你一直拒绝接受帮助,我们该怎么办?基本上我想从cmdfun()直接调用的函数返回名为cmdfun()的函数中的错误,例如main(),这里是func()。因此堆栈是func()->cmdfun()->main(),但我想要func()直接将错误返回给main()。@VVI C和C 15不要让OP继续寻找错误的树。你的answr没有多少价值。
#include <iostream>
using namespace std;

#define CHECK_VEC(acondition)\
if(checkcondition(acondition)) return -1;

bool checkcondition(bool acondition)
{
    if (acondition) return 1;
    return 0;
}

int fun_called_by_main()
{
    int a = 5 + 4;
    bool acondition = a;
    CHECK_VEC(acondition);

    return 1;
}


int main()
{
    int a = fun_called_by_main();

    cout << a << endl;

    cin.get();
    return 0;
}