杂谈(5)-main函数的返回值


今天看到个问题是关于xcode不支持main返回void类型的,我很感兴趣,顺便去查了些资料,基本可以对main函数的返回值做一个(对我自己而言)盖棺定论的结论。

我们该使用void main()吗?

(本节为经过简单修改的原回答。)
简单结论:除非您在一个非常特殊的系统或者裸机上写程序(绝大多数人显然没有这种需求),否则您应该放弃试图令main函数返回void。当然,这仅仅是建议。


首先,C++语法标准规定main的返回值必须是int。经过考证,我相信C++标准也从未允许过这样做。当然,不排除有些编译器仍在标准之外允许返回void,但我并不知道有哪些编译器有这种功能。退一万步,即便旧标准允许你这样做,我也还是建议你遵循这个规定。毕竟,不能用新语法的代价太大;C++这些年的语法产生了天翻地覆的变化。(尽管学校里的课程并不能体现这点,但工作中很少有执着于旧标准的单位,相当一部分工程师也会追随新标准。执着于旧标准意味着你和同事们的合作也会变得困难。)


对于C而言,我到StackOverflow确认了下,C语言从未规定过返回值为void的main函数,但允许实现定义的签名(implementation-defined signature)。因此结论是:无论是C还是C++,我们都不建议令main返回void,因为这是不标准的,而且从未成为过标准。有些教材言之凿凿地声称可以这么写,(引用StackOverflow的回答原文)这样的教材不是过于老旧就是水平太差,也可能两种因素都存在。换言之,这么做会引发可移植性问题,具体而言就是可能引发UB,而这种级别的UB可以引发从没有异常到系统发生不可恢复的崩溃(比如说硬盘彻底损坏)在内的不可预测的后果。
因此,想要使用void返回值的main函数,只能去翻找编译器的特定版本实现,并认真阅读编译器文档,确认它真的不会引发UB。(能过编译不代表不会引发UB。)此外,由于这种做法是不标准的,编译器随时可能取消支持。因此,哪怕是同一个编译器,也不可能保证永远支持void main()。


参考资料:
建议直接看C标准原文引用,最权威:
StackOverflow-C和C++中,main应该返回什么?
StackOverflow-int main() vs void main()
StackOverflow-为什么main函数的定义留给用户?
StackOverflow-为什么不给main用void?
重点在于,这里面所有有经验的工程师,无一例外地(从语言层面)反对main函数返回void。但我们强调:事实上有很多人反对这种设计,这也是有理由的。main函数的返回值会呈递操作系统,但操作系统本身底层也可能是C写的,那么操作系统终止时返回给谁?似乎没有这个必要。但除非您想要写裸机(Bare-Metal,也即没有操作系统和C标准库,直接操作硬件)程序,否则我认为没有反对这种设计的合理理由。

总结

  • C/C++从未把void main()纳入标准。如果你希望书写可移植程序,那么毫无疑问,绝对不应该用void main()。
  • C++现行标准中,不要用void作为main的返回值。
  • C语言中,尽管你可以写void main()(如果编译器允许),但我们不建议这样做,有UB风险。除非你有充分理由这样做。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值