为什么 void main() 没有标准化为 main 函数的有效签名?

问题描述 投票:0回答:4

为什么在 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++ standards program-entry-point language-design entry-point
4个回答
17
投票

C++ 标准委员会可能选择要求

int main()
,因为大量现有代码期望使用
return
语句将特定的退出代码返回到运行时系统。期望所有现有代码都改为使用
exit()
是不合理的,因此标准中提出了
int main()
的要求。

像 Java 这样的语言在设计时没有任何需要保持兼容的现有代码体。因此,设计者可以选择

void main()
并要求对非零退出代码使用
System.exit()

因此,为 C++ 标准选择

void main()
的“错误”在于,它将破坏预期使用
return
的现有代码以及来自
main()
的退出代码值。


12
投票

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 中)。


9
投票

您通常想知道程序的退出状态。这就是您拥有

int main()
的原因——您返回退出状态。


4
投票

这是错误的,因为这不是 C++ 标准指定的合法内容

main
。没有人关心其他语言指定的内容。对于 C++ 程序,只有 C++ 标准相关,它说
int

© www.soinside.com 2019 - 2024. All rights reserved.