【问题标题】:Why is void main() so popular?为什么 void main() 如此受欢迎?
【发布时间】:2015-05-23 23:14:56
【问题描述】:

在 C89/C99/C11 中,在独立环境中,入口点函数是实现定义的。在托管环境中,它必须是严格符合程序中的int main。大多数现代编译器都会使void main 出错。但是,我看到许多用户使用void main。即使在不符合标准的编译器中允许使用它,为什么还要使用它?我看不出为什么void mainint main 更受欢迎。即使在 C89 中,省略 return 也是未定义的行为。

void main的流行有历史原因吗?

我认为我的问题主要不是基于意见。在这个线程中已经提出了一些有效的想法,例如微软的void main 扩展,以及自从Window 流行以来,以及它是C 书籍重印错误信息的结果。这些都是客观和历史原因。

【问题讨论】:

  • 可能是因为很多人不关心将失败/成功返回给操作系统。
  • 可能与想要返回 42 有关,但没有人知道它应该是什么意思。
  • 人们并不总是知道自己在做什么。
  • 请参阅:What should main() returnin C and C++? 以了解有关该主题的综合处理。 IMO,它很受欢迎,因为(a)它允许您避免编写一行代码代码,并且(b)微软说它在 Windows 机器上是可以的。这也意味着您不关心程序的退出状态——您不是在退出状态很重要的脚本环境中编写代码。
  • 呃,Herb Schildt...lysator.liu.se/c/schildt.html

标签: c standards main


【解决方案1】:

void main 的流行有历史原因吗?

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

也许一些编译器生产商(甚至可能是微软。如你所知,C# 允许用 void 声明 Main。至少 Borland C++ 允许使用 void main)引入了他们自己的实现定义的 main 声明。带 void 的 main 是一种流行的实现定义声明。因此,有关 C 编程的书籍通常会引用这些流行的编译器及其实现定义的主声明。

【讨论】:

  • void main() 在第一个 C 标准之前并不是一个真正的选项,因为在第一个 C 标准之前,void 并不是 C 的一部分。半允许的只是main()——没有明确的返回类型——但如果使用了值,你仍然应该从这些函数中返回一个值。人们没有看到使用来自 main() 的返回值的代码,即使 shell 得到了它。
  • IIRC(但我的记忆可能有误,我老了)MSDOS 上的一些旧 TurboC 编译器接受(或者可能更喜欢)void main() 这是在 1980 年代初期
  • +1 这个答案,因为你的基本想法是正确的,但我认为这些书大部分都是在标准化后编写的。问题只是他们的作者不称职,但设法出版了很多人读的书。 IMO 对 C 语言的滥用和人们对 C 的误解(通常是负面看法)的大部分责任可以追溯到糟糕的书籍和糟糕的讲师形式的糟糕教学。
  • 我怀疑 Turbo C 是迄今为止最大的罪魁祸首,当时它是完全占主导地位的编译器,它允许使用 void main()。即使在今天,我们仍然让学生与蹩脚的老师在 SO 上用这种主要形式发布问题感到困惑。 (主要是因为某个国家的落后教育系统(我不会点名)似乎在全国范围内决定 Turbo C 仍然是垃圾中的精华,而 DOS 是未来的操作系统。)
  • “废话中的精华”
【解决方案2】:

引用 Lundin 的 answer

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

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

编辑:

当 OP 询问托管环境时,我可以引用 Keith 的 answer

类似地,C 从未允许 void main() 除了作为 延期; 1989 年引入 void 关键字的标准 定义了 main 的两个标准定义:int main(void) 和 int main(int argc, char *argv[]).

还有波奇的answer

您通常想知道程序的退出状态。那是 为什么你有 int main() - 你返回你的退出状态。

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

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

【讨论】:

  • 我不明白这是如何回答这个问题的。
  • @juanchopanza OP 询问 我看不出为什么 void main 比 int main 更受欢迎。这就是原因。
  • @volerag 我已经在我的问题中提到了独立部分。我问的是托管环境。
  • 作为在某个时候编写该答案的人,我现在不太确定 - 该标准实际上可以解释为“任何实现定义的方式”,即使对于托管环境也是如此。但是你必须意识到实现定义的含义,它的意思是“在这种情况下编译器可以为所欲为只要它记录如何”。如果某个非标准形式的 main 不存在此类编译器文档,则应将其视为未定义行为。
  • 独立的环境中,首先你不应该调用函数mainmain 函数在标准中得到了很好的定义,使用 不同的 类型的 main 只是令人困惑。将其称为 kmainkernel_main 或类似名称,没有人会因为返回类型为 void 而对你产生怀疑。
【解决方案3】:

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

  1. 复制以下代码到test1.c

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

    cc test1.c
    
    gcc test.c
    
  3. 跟随

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

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

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

这就是不推荐的原因。

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

【讨论】:

  • K&R 第 1 版。不可能使用void main,因为当时甚至还没有发明void(直到C++诞生)。 K&R 第 1 版。在很多地方使用隐式int
  • 感谢@Jens 的回答
猜你喜欢
  • 1970-01-01
  • 2010-10-20
  • 2010-12-22
  • 2016-01-20
  • 2019-06-11
  • 2021-04-04
  • 1970-01-01
  • 2017-10-10
  • 2020-10-25
相关资源
最近更新 更多