2016-11-28 56 views
2

我认为,即使函数没有实际返回任何东西,最好返回一个整数。 返回的值可用于反映函数内的各种错误条件。在C++中总是选择一个整数返回函数而不是“void”函数,是否有任何代价我们付出了代价?将所有void函数转换为非void函数

+1

是的。它被称为可读性。 – PiotrNycz

+1

我没有规范的答案给出,但这是一个可怕的想法。你如何区分“void”函数和返回'int'的函数?这会使代码的可读性更差,并且违反[YAGNI](https://en.wikipedia.org/wiki/You_aren't_gonna_need_it)规则。 –

+4

什么是在这里downvote?这个想法可能是错误的,但这并不是元数据,表明达成一致。 – Angew

回答

9

您将有必须从每个函数返回一个值的计算开销。但好的优化器可能会删除多余的返回值。

这是个坏主意,因为它会让你的代码不可读。但是,由于另一个原因,这是一个糟糕的主意:它会给未定义的行为带来另一种可能性,从而陷入您的程序中。除main之外,标记为int的所有功能必须返回int全部控制路径。

为什么不使用异常机制;这是惯用的方式?

6

如果你有一个设计策略函数应该返回一个代码告诉你它是否成功,然后改变void函数返回这样一个值是有道理的。你最终通过引用传递输出参数而不是返回值,并且你得到的代码看起来不像惯用的C++。但是,如果它只是功能,否则将不会返回任何东西,这只是一个随心所欲的变化,并会让人们陷入混乱。

如果函数不能做它应该做的事情,它应该抛出异常。

4

是的,会有附加价格。我们会付出创造代码的代价,这个代码不太清晰,也更容易出错。

首先,退回生int将是一个可怕的想法。如何区分int返回类型是实际整数的函数和int返回类型是错误代码的函数?

但是,即使你修改了int尺寸,int类似ErrorCode类型,但它仍然是一个坏主意。您现在掌握了很多功能,声称可能导致错误。问题是,什么样的错误是可能的?理论上,每个呼叫站点应该检查所有可能的错误,如果不处理它们然后传递它们。

实际上,这会产生两个后果之一。任何人都可以通过这个来实现,而且每一个功能代码都会被错误处理所吞没。

或者(更可能)人们只是辞职并忽略返回的错误代码,可能带有诸如// this cannot fail的评论。但是,这会给你一种虚假的安全感。在编写函数时,您“安全地”返回一个错误代码并假定它将被处理。然而,主叫方很可能会高兴地忽略它。

在C++中,如果你想让调用者知道出现了错误,你应该使用内建错误机制:例外。调用者不需要刻意地忽略它们,并且允许您编写只关心对它感兴趣的错误的代码。