为什么在 C++ 中将入口点的返回类型设置为
void
总是不被鼓励,后来被标准删除并被现代编译器禁止?为什么它被认为是不好的做法?
现在,据我了解,C# 和 Java 都允许入口点的返回类型为
void
即
static void main(String[] args) /* Java */
static void Main(string[] args) /* C# */
C# 和 Java 程序员并不认为这是不好的做法,事实上他们经常使用它。
其他语言(只是有意,我怀疑 C++ 至少会在这十年内取得成功)可能是 C++ 的继承者,例如 D 编程语言或 Vala,也允许
void main()
。正如您所看到的,我怀疑 C++ 社区将其从标准中删除,因为它太晦涩或不受欢迎。
所以我的问题是,为什么 C++ 社区删除了
void main()
?到底出了什么问题?
C++ 标准委员会可能选择要求
int main()
,因为大量现有代码期望使用 return
语句将特定的退出代码返回到运行时系统。期望所有现有代码都改为使用 exit()
是不合理的,因此标准中提出了 int main()
的要求。
像 Java 这样的语言在设计时没有任何需要保持兼容的现有代码体。因此,设计者可以选择
void main()
并要求对非零退出代码使用 System.exit()
。
因此,为 C++ 标准选择
void main()
的“错误”在于,它将破坏预期使用 return
的现有代码以及来自 main()
的退出代码值。
C++ 从不允许
void main()
,尽管某些编译器可能允许它作为扩展或仅仅因为它们不诊断它。
类似地,C 从未允许
void main()
除了作为扩展;引入 void
关键字的同一 1989 年标准定义了 main
的两个标准定义:int main(void)
和 int main(int argc, char *argv[])
。
其他语言允许这样做,因为它们是其他语言。
能够写
void main()
而不是int main()
并没有什么特别的优势。您甚至不需要显式返回值;从 main
的末尾脱落相当于 return 0;
(在 C++ 中,以及在以 C99 开头的 C 中)。
您通常想知道程序的退出状态。这就是您拥有
int main()
的原因——您返回退出状态。
这是错误的,因为这不是 C++ 标准指定的合法内容
main
。没有人关心其他语言指定的内容。对于 C++ 程序,只有 C++ 标准相关,它说 int
。