C 为什么void main()如此流行?

C 为什么void main()如此流行?,c,standards,main,C,Standards,Main,在C89/C99/C11中,在独立的环境中,入口点函数由实现定义。在托管环境中,它必须是严格一致的程序中的int main。大多数现代编译器将void main作为错误。但是,我看到许多用户使用voidmain。即使它在不一致的编译器中是允许的,为什么要使用它呢?我看不出为什么void main会比int main更受欢迎。即使在C89中,关闭返回也是未定义的行为 void main的流行有历史原因吗 我不相信我的问题主要是基于观点的。一些有效的想法已经在这个帖子中出现了,比如微软的void m

在C89/C99/C11中,在独立的环境中,入口点函数由实现定义。在托管环境中,它必须是严格一致的程序中的
int main
。大多数现代编译器将
void main
作为错误。但是,我看到许多用户使用
voidmain
。即使它在不一致的编译器中是允许的,为什么要使用它呢?我看不出为什么
void main
会比
int main
更受欢迎。即使在C89中,关闭
返回也是未定义的行为

void main
的流行有历史原因吗

我不相信我的问题主要是基于观点的。一些有效的想法已经在这个帖子中出现了,比如微软的
void main
扩展,以及自从Window流行以来,以及它是C图书重印错误信息的结果。这些都是客观和历史的原因。

引用伦丁的话

如果您的程序在无主机环境中运行(您的程序是 嵌入式系统或操作系统),它可能有任何回报 类型。void main()是最常见的

如果您的程序在托管环境(操作系统之上)中运行, main()必须返回int,并且可能有其他参数

编辑: 由于OP询问的是托管环境,我可以引用Keith的

类似地,C除了作为 扩展;与1989年引入void关键字的标准相同 定义了main的两个标准定义:int main(void)和int main(int argc,char*argv[])

还有波奇的

您通常希望了解程序的退出状态。这就是问题所在 使用int main()的原因——返回退出状态

从这两个令人信服的答案中,我可以以我的拙见得出以下结论:

在C89/C99/C11的时候,C可能不允许
void main
,但是对于爱好者、学习者和初学者创建的小程序,他们可能不关心这个阶段的返回值,因此
void main
变得流行起来。

void main的流行有历史原因吗

在我看来,历史原因是,关于C语言编程的书籍(尤其是民粹主义的)是在标准被采用之前编写的,并且是在标准被采用之后(甚至之前)出版的。许多关于C语言编程的书籍都包含了返回类型为void的main声明。有时这些书在没有修改内容的情况下重新出版。由于旧编译器通常支持带void的main声明,这种声明很流行


也可能是编译器编译器(甚至是微软)。如你所知,C允许声明主空。至少Borland C++允许使用空格main)介绍自己的实现定义的main声明。带有void的main是一个流行的实现定义的声明。因此,关于C语言编程的书籍通常会引用这些流行的编译器及其实现定义的主声明。

如果您使用*NIX或MAC,请执行以下操作

./a.out
  • 将以下代码复制到test1.c

    void main() {
    }
    
  • 在命令行中编译代码

    cc test1.c
    
    gcc test.c
    
  • 跟踪

    ./a.out
    
  • 运行以下命令(这将显示程序返回的内容

    echo $?
    
  • 将此代码保存到test2.c

    void main() {
        int i = 5;
    }
    
  • 对test2.c重复2、3和4

  • 这就是为什么不建议这样做


    为什么它很受欢迎?除了上面的答案,我不知道其他答案。不过我有一个问题:K&R第一版使用的是
    void main()
    还是
    int main()

    可能是因为很多人不关心将失败/成功返回到操作系统。可能与想要返回42有关,但没有人知道这意味着什么。人们并不总是知道自己在做什么。请参阅:关于这个主题的综合论述。依我看,这很流行,因为(a)它允许您避免编写一行代码和(b)微软说这在Windows机器上是可以的。这也意味着你不关心程序的退出状态——你不是在一个脚本环境中编写代码,退出状态很重要。呃,赫伯·施尔特……我不明白这是如何回答这个问题的。@juanchopanza的操作问我没有看到为什么void main会更受欢迎的实际原因ed to int main。这就是原因。@volerag我在问题中已经提到了独立部分。我问的是一个托管环境。作为在某个时候写这个答案的人,我现在有点不太确定了-这个标准实际上可以解释为“任何实现定义的方式”,即使对于托管环境也是如此。但您必须认识到定义的实现的含义,它意味着“在这种情况下,编译器可以随心所欲地执行,只要它记录了如何执行”。如果某个非标准形式的main不存在此类编译器文档,则应将其视为未定义的行为。在独立的环境中,首先不应调用函数
    main
    main
    函数由标准定义,并且使用不同类型的
    main
    是必要的st混淆。称它为
    kmain
    kernel\u main
    或类似的东西,没有人会因为它的返回类型为
    void
    void main()
    在第一个C标准之前实际上不是一个选项,因为在第一个C标准之前,
    void
    实际上不是C的一部分。半允许的只是
    main()
    -没有显式的返回类型-但是如果使用了值,您仍然应该从这些函数返回值。人们没有看到使用
    main()
    返回值的代码,即使shell