C中的int main()与void main()

Posted

技术标签:

【中文标题】C中的int main()与void main()【英文标题】:int main() vs void main() in C [duplicate] 【发布时间】:2012-03-10 12:30:09 【问题描述】:

在 C 中,我知道 int main() 返回一个 intvoid main() 没有。除此之外,它们之间还有区别吗?第一个比第二个好吗?

【问题讨论】:

使用int main(void),而不是int main() 停止阅读此处并转到链接的副本。以下所有答案在某种程度上都包含事实错误。请参阅链接的副本。特别是乔纳森·莱弗勒和你的回答真诚。 【参考方案1】:

绝大多数时候,您需要使用int main(void)int main(int argc, char* argv[]) 之一。特别是,如果您正在编写一个将由任何主要编译器编译以在个人计算机上运行的程序,以及全套 C 标准库,那么您几乎肯定需要从 @ 返回一个 int 987654326@.

(我也会避免使用空参数列表,请参阅“Why don't we use (void) in main?”)

C99 标准确实允许其他实现定义的签名,如果您已阅读编译器手册并且说明可以使用,则可以使用这些签名。

(5.1.2.2.1) 应使用 int 的返回类型且不带参数...或带两个参数...或以其他一些实现定义的方式定义/p>

我个人会避免使用它们,即使它们 被允许(如果可能),因为如果您需要移植到另一个系统,这又是一件需要担心的事情。

请参阅“Why don't we use (void) in main?”下方的 cmets,了解有关此问题的一些有趣讨论。

【讨论】:

5.1.2.2.1 仅适用于托管实现。 PICC32 大概是独立的,不是托管的。所有托管实现必须允许 int main(void)int main(int argc, char *argv[]) 或等效项。 @KeithThompson - 我一直不太清楚托管和独立之间的区别,但是 PIC32 编译器(可选)都使用全套 C 标准库,我认为这意味着它们可以两者都有。 @KeithThompson 如果您引用标准,请引用整个段落,而不仅仅是有助于您论证的部分。话虽这么说,该行的其余部分是“...或等效的;或以其他实现定义的方式。”(C11 §5.1.2.2.1 - 程序启动)使其完全合法时实施允许它。 Detly 对允许实现定义的签名的评估是绝对正确的。 @Wiz: 显然HITECH PICC32实际上禁止 int main(void);这意味着它不能是符合标准的 hosted 实现。它可能是也可能不是符合标准的独立实现。允许实现定义的main 是绝对正确的;我从来没有说过别的。 这里的 cmets 大多是不正确的。托管实现不必支持上述两种形式。 托管系统的标准(PIC 不是)说白底黑字:“它应定义为返回类型为 int 且不带参数:int main(void)... 带有两个参数(此处称为 argc 和 argv)... 以其他一些实现定义的方式。【参考方案2】:

如果你的书上写着void main(),要么是非常非常过时,要么是白痴写的(或两者兼而有之)

编辑:好的,除非你在一个非常不可能的系统中,你有一个独立的主 - 请参阅Why is the type of the main function in C and c++ left to the user to define?

【讨论】:

请说明一些相同的原因,因为这对包括我在内的其他人有帮助 什么书?问题中没有任何关于书的内容。 @T.J.Crowder - 我假设 OP 自己没有发明 void main() 。有一本我不会命名的作者的流行 C 参考书(因为他的名字从地狱召唤恶魔)其中使用了 void main() 以及许多其他错误 我只是想知道它们之间的区别。非常感谢大家 void main() 没有过时;这是错误的。它在 C 标准的早期版本中不再有效。【参考方案3】:

void main() 无效 C. int main() 是。这是主要区别。

【讨论】:

它是有效的实现定义的 C99,AFAIK (5.1.2.2.1) @madU: 不行,不能用。 不,绝对不能写void main(),除非您使用的是独立实现,在这种情况下它可能是有效的(实现定义的)。 C 的独立实现是不提供任何更高级别的 C 标准库特性的实现;在实践中,它要么是一个超小型的嵌入式系统,要么是一个操作系统内核的基础。 @R.. 我只是偶然遇到了这个问题;你的回答是绝对错误的。这与独立实施无关。 C11 §5.1.2.2.1 - 程序启动 - 清楚地写着“int main(void)”、“int main(int argc, char *argv[])”或等价物; 或以其他一些实现定义的方式。因此,如果实现允许,它是 100% 有效的 C。根据标准,它唯一不是strictly conforming program @Wiz:如果实现不允许允许,那么使用void main() 的程序的行为是未定义的。 void main()(或void main(void)有条件地有效,但在托管实现下使用它没有任何好处(特别是因为从 C99 开始,从 main 的末尾脱落会隐含return 0;)。

以上是关于C中的int main()与void main()的主要内容,如果未能解决你的问题,请参考以下文章

C--int main 和void main的区别

C/C++ 中 void main 和 int main 的区别? [复制]

int main()vs void main()in C [duplicate]

C语言中 main 是啥意思?

请问在C程序中啥时候用int main() 啥时候用 void main()。二者是不是可以相互代替?

“int main(void *framep)”的目的是啥?