关于返回 void 的文体问题

Posted

技术标签:

【中文标题】关于返回 void 的文体问题【英文标题】:Stylistic question concerning returning void 【发布时间】:2010-11-17 11:21:15 【问题描述】:

考虑以下人为的例子:

void HandleThat()  ... 

void HandleThis()

    if (That) return HandleThat();
    ...

这段代码工作得很好,我很确定它是规范有效的,但我(也许我自己)认为这种不寻常的风格,因为调用似乎返回了函数的结果,尽管事实上两者函数的原型是 void。

通常,我希望看到:

if (That) HandleThat(); return;

我觉得这对正在发生的事情毫不含糊。

SO 社区,对于返回无效的编码风格是否令人困惑或有问题,我能否获得您的意见?它有成语的感觉;我应该使用它还是避免它?

一般来说,我会力求清晰并使用第二种样式。另一方面,第一种形式的简洁性有点吸引我。

【问题讨论】:

如果有任何兴趣,我的实际用法是在某些情况下保释到父类。即: void derivedclass::f(...) if (bail) return parentclass::f(...); ... 【参考方案1】:

我同意你的观点,第一种风格令人困惑,因为它暗示某种价值正在被返回。事实上,我不得不读了几遍因为

当从一个原型为 void 的函数返回时,它应该只是返回;

【讨论】:

+1 我看不出任何人在返回 void 时应该使用第一个约定的充分理由。 同意,后者更直观、更易读——绝对值得多加几个字符。 后者更直观易读。但是,第一个也非常可读,您从中直觉是正确的。所以它不会破坏你的直觉。 @Dave:如果您认为 void 既是一个值又是一个类型,那就对了。我认为它是一种不能包含值的类型。 @Kevin:我的直觉告诉我,第一个约定有点误导。它向我暗示,HandleThat 方法的返回比简单的返回语句更有意义。我的意思是在看到它的最初几秒或几毫秒的上下文中。基于此,我会说第二个约定不太可能引起混淆,因此更易于维护。软件工程师专注于任何一行代码的时间越少,他(/她)必须浏览的数百万行代码越好。【参考方案2】:

这可能有点太聪明了。如果该行最终距离函数顶部超过几行,则会令人困惑。这也意味着查看代码的程序员需要关联

return HandleThat();

用void返回类型,在他们真正理解代码之前弄清楚它的聪明之处。当你在 if/else 分支中做不止一件事时,你真的应该使用大括号并将步骤放在不同的行上。占用更多空间但更容易理解:

if (That) 
    HandleThat();
    return;

【讨论】:

【参考方案3】:

C 语言规则规定,如果声明为返回 void 的函数尝试返回表达式,则不会计算该表达式。

http://c0x.coding-guidelines.com/6.8.6.4.html

【讨论】:

两种样式生成相同的结果。对于此代码: void a() printf("World!\n"); void b() printf("Hello, ");return a(); 你得到了预期的 Hello World。 我已经通过使用 GCC 4.0 的全面优化和剥离验证了这一点 嗯,有参考吗?据我所知,它是有效的。它很少在模板代码之外使用,但应该是有效的并且函数确实会被评估。反正据我所知。 定义明确,表达式被计算。 [stmt.return] '带有“cv void”类型表达式的return语句只能在返回类型为cv void的函数中使用; 表达式在函数返回其调用者之前被评估。' 嗯,它一定是在某个时候滑入的——这似乎允许它。虽然 C 标准没有类似的规定c0x.coding-guidelines.com/6.8.6.4.html【参考方案4】:

以前从未见过。

它的优点是看起来像非 void 返回类型的常用习语,所以它很容易阅读......

除非有人能证明它是无效的,否则我不会更改它。

【讨论】:

【参考方案5】:

我相信第一个版本主要是为了简化模板编程。如果 HandleThat 返回的类型 T 可能是也可能不是 void,那么使用第一个版本很方便。

但在“正常”情况下,第二个版本更清晰,我更喜欢那个。

【讨论】:

以上是关于关于返回 void 的文体问题的主要内容,如果未能解决你的问题,请参考以下文章

让springboot序列化空值null为"null"而不是空报文体(jackson)

接口八问 & 接口测试质量评估标准

对于不返回 void 的 C++ 函数,是不是必须使用 return 语句?

关于信号处理函数的参数问题!signal ???

关于一道游戏笔试题

关于在 C 中将 `void *` 转换为 `int` 的问题