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++_Exception_Return_Break_Goto - Fatal编程技术网

C++ 使用标志、返回、异常、转到或中断中止过程

C++ 使用标志、返回、异常、转到或中断中止过程,c++,exception,return,break,goto,C++,Exception,Return,Break,Goto,我有一个代码,它解析一个文件,如果满足无效条件,它就会崩溃。 代码是C++的,类似于: bool ok = true; if (task1() == false) ok = false; if (ok && (task2() == false)) ok = false; if (ok && (task3() == false)) ok = false; cleanup(); return ok; 现在我正在寻找更清洁的替代品,以获得同样的

我有一个代码,它解析一个文件,如果满足无效条件,它就会崩溃。 代码是C++的,类似于:

bool ok = true;
if (task1() == false)
    ok = false;
if (ok && (task2() == false))
    ok = false;
if (ok && (task3() == false))
    ok = false;
cleanup();
return ok;
现在我正在寻找更清洁的替代品,以获得同样的结果。 据我所知,有:

  • 使用上面代码中的标志和许多条件
    • 对于相同的信息,有许多冗余测试。 对运行时的影响可以忽略,而且可能 完全由编译器删除,但仍会生成代码 更复杂
  • 您可以将任务包装在方法中并从中返回
    • 这看起来更干净,但您可以将代码分散到多个位置 功能。根据您的上下文,可能会有很长的时间 参数列表。更多的是,它也不是 最好将回报分散到整个方法中
  • 您可以使用异常
    • 这将提供一些相当描述性的代码,但它也是 很重,因为你只想跳过一些电话。更何况 可能并不完全是例外
  • 您可以从
    do while(0)
    或另一个循环中
    中断
    
    或switch语句。
    
    • 嗯,这并不是真的要完成这样的任务。除了 您可以使用它获得轻量级和紧凑的实现 和描述性关键字
  • 使用
    goto
    语句
    • 这似乎结合了大多数优势。不过,我还是不确定。 到处都有人在说,打破多重循环 是该关键字唯一合理的用法
我没有发现关于这种代码的讨论。通常建议哪些实现?这种情况在任何C++编码准则中都有提到吗?还有其他可行的选择吗

编辑:我的目标似乎并不明确。我正在寻找一种最好的方法来打破一个过程,而不是一种调用三个方法的方法。所描述的问题更多地是一个示例。我对支持和反对不同语法的论点很感兴趣

在对象的代码中,每个方法都是一对代码行的占位符,这些代码行相似但彼此不同。可能有50个代码块。一个旧的代码块如下所示(我知道要优化的东西比这个问题的目标还要多):

if(确定)
{
keyString=“速度”;
tmpVal=configuration->getValue(部分,键串,-1);
如果(tmpVal!=-1)
{
m_速度=tmpVal;
如果(单位速度<单位分钟速度)
m_min速度=m_速度;
m_needSpeed=真;
}
否则,如果(m_需要速度)
{
ok=假;
keyErr=键串;
}
}

假设所有这些函数都返回一个
bool
,在我看来,显示的代码在逻辑上与以下代码相同:

bool ok= task1() && task2() && task3();

cleanup();

return ok;

如果
,你为什么不直接使用
?无论人们说什么,打破多个循环是这个关键字唯一合理的用法。还有更多,但是
goto
应该是你最后能找到的工具之一,因为即使你做对了,也没有人会相信你做对了。非常罕见的情况是,
goto
实际上使代码更简单、更易于维护,当您找到一个时,您可能仍然错了。注意:对于多重循环转义子句,我不会使用
goto
。我把多个循环放在一个函数中,然后从函数返回。
bool ok= task1() && task2() && task3();

cleanup();

return ok;