基础知识 | 每日一面(70)

古代的剑客们与

对手相逢时,无

论对手多么强大,

明知不敌,也要亮出自己的剑!

读者:我觉得把 main() 声明为 void 不会失败, 因为我调用了 exit()

而不是 return , 况且我的操作系统也忽略了程序的退出/返回状态。

小林:这跟 main() 函数返回与否, 或者是否使用返回状态都没有关系; 问题是如果main() 声明得不对, 它的调用者 (运行期初始代码) 可能甚至都不能正确调用它。你的操作系统可能会忽略退出状态, 而 void main() 在你那里也可能可行, 但这不可移植而且不正确。

读者:那么到底会出什么问题?真的有什么系统不支持 void main()

吗?

小林:有人报告用 BC++4.5 编译的使用 void main() 的程序会崩溃。某些编译器(包括 DEC C V4.1 和打开某些选项的 gcc) 会对 void main() 提出警告。

读者:我一直用的那本书总是使用 void main()。

小林:可能这本书的作者把自己也归为目标读者的一员。很多书不负责任地在例子中使用 void main(), 并宣称这样是正确的。但他们错了。

读者:从 main() 中, exit(status) 和返回同样的 status 真的等价吗?

小林:是也不是。标准声称它们等价。但是如果在退出的时候需要使用 main() 的局部数据, 那么从 main() return 恐怕就不行了。少数非常古老不符合标准的系统可能对其中的某种形式有问题。最后, 在 main() 函数的递归调用时,二者显然不能等价。

有时候,正是那些意想不到之人,成就了无人能成之事。

——图灵

正文完