【发布时间】:2016-08-28 19:50:52
【问题描述】:
我有几个 void 函数(我们称它们为 foo 和 bar),它们共享相同的 void 函数清理,如果它们搞砸了,它们会在它们之后清理:
#include <iostream>
void cleanup() { std::cout << "doing cleanup" << std::endl; }
void foo(int & i) {
if(i == 0) { return cleanup(); }
--i;
if(i == 0) { return cleanup(); }
++i;
}
void bar(int & i) {
if(i == 0) { return cleanup(); }
++i;
if(i == 0) { return cleanup(); }
--i;
}
int main() {
int i = 0;
foo(i);
bar(i);
return 0;
}
cpp.sh 愉快地编译并运行代码。
感谢the answer to this question 我知道我可以返回 void 类型的对象。但我不知道它是否适用于返回 void 返回值。
你怎么看,代码符合标准吗?
您宁愿返回虚拟整数以使代码更具可读性吗?还是无用的返回值会使代码更难阅读?
编辑:我觉得我需要澄清一些原因,例如'清理();返回;'不是解决方案。实际代码比示例更复杂,并且取决于我将函数留在哪里,在 cleanup() 调用之后会发生一些其他事情。 '返回清理();'这只是一种方便的方法,在我可以/必须立即离开的情况下,不要把所有的东西都放在条件句中。
【问题讨论】:
-
“感谢对这个问题的回答,我知道我可以返回
void类型的对象。” 没有void类型的对象,并且返回类型为void的函数只返回控制权。 -
为什么不直接
{ cleanup(); return; }? -
或者使用 RAII 这样你就不必编写清理代码了。
-
@a.peganz 您可以将其他一些东西放在 RAII 类型中,然后在函数退出时将其销毁并运行代码。这样代码可以自行管理,您不必记住在每个退出点都调用
cleaup。 -
@a.peganz RAII 不仅仅是分配和销毁资源。如果您需要运行一些代码,任何代码,并且您希望此代码在函数返回时运行,而不管该函数返回的原因,RAII 都可以用来执行此操作。
标签: c++ coding-style standards-compliance