C中main(void)和main()之间的区别[重复]
Posted
技术标签:
【中文标题】C中main(void)和main()之间的区别[重复]【英文标题】:Difference between main(void) and main() in C [duplicate] 【发布时间】:2011-04-12 06:45:53 【问题描述】:谁能告诉我int main()
和int main(void)
之间的区别?为什么它们都有效?int main()
的默认参数是什么?
【问题讨论】:
【参考方案1】:一般情况下没有区别。这不是“main() 的默认参数”,因为它根本没有参数。
这是不寻常的情况。如果您自己编写对 main 的调用,那么 ()
将允许您传递任何您喜欢的参数,而 (void)
将强制您不传递任何参数。尽管如此,就 99.99999999% 的情况而言,这些都不重要,运行时主要调用它来启动您的程序。运行时既不知道也不关心你是写()
还是(void)
。
如果您编写标准 int main(int argc, char **argv)
,您将在其中获取命令行参数。
【讨论】:
+1 -- 在 C++ 中没有区别,但在 C 中略有不同。虽然很小。"No difference"
,阅读比利的帖子。
@Billy:这个问题已被标记为 C 而不是 C++。
@Prasoon:是的,我知道。我仍然发现这个答案在 C++ 中是正确的。此外,仅仅因为 C 在技术上存在差异并不意味着它是常用的或重要的差异。因此,我认为这是一个很好的答案,值得一票。
@Billy ONeal:如果您考虑 C(标签),这个答案在技术上并不是 100% 正确的(如您所说)。但我仍然不会赞成这个答案。顺便说一句,我喜欢你的回答,并投了赞成票。【参考方案2】:
main()
允许您使用任意数量的参数调用 main。 main(void)
强制您在没有参数的情况下调用 main。所以:
main(foo, bar);
main()
可以,但main(void)
不行 - 编译器会产生错误。
现在,如果您专门询问程序的入口点,那并没有什么不同;在任何一种情况下,您都不会有程序的参数(argc、argv、envp)可用。
【讨论】:
+1 -- 注意envp
是一个非标准扩展。
@Billy ONeal:但 §5.1.2.2.1.1 中的标准允许。
@Matt:我从来没有说过这是不允许的。我只是说它不在标准中。【参考方案3】:
从实际的角度来看,没有真正的区别。使用int main(void)
,您明确声明main
不接受任何参数,因此您不能使用任何参数调用它。使用int main()
,您可以使用一些参数调用main
。
但是,除了在代码高尔夫或故意混淆代码之类的奇怪情况下,您无论如何都不会调用main
——它是程序的入口点,因此它会被启动代码自动调用。无论如何,启动代码都会传递命令行参数,因此您的选择不会改变它的调用方式,只会改变您是使用还是忽略传递的参数。
该标准确实允许您定义 main
带或不带参数(第 5.1.2.2.1/1 节):
程序启动时调用的函数名为main。实现声明没有 这个函数的原型。它应定义为返回类型为 int 并且没有 参数:
int main(void) /* ... */
或带有两个参数(此处称为 argc 和 argv,尽管任何名称都可以 使用,因为它们在声明它们的函数中是本地的):
int main(int argc, char *argv[]) /* ... */
或同等的;
虽然它在指定的标签之外,但在 C++ 中情况略有不同。在 C 中,函数声明如下:
int f();
指定f
是一个返回int
的函数,但no 提供有关f
可能期望的参数数量或类型的信息(主要是为了与旧代码兼容-- 曾经,这是在 C 中声明函数的唯一方式)。在 C++ 中,同样的声明将 f
显式声明为不带参数的函数,因此尝试使用一个或多个参数调用 f
无法调用此函数(它必须调用另一个重载或在没有合适的重载时产生错误已找到)。
【讨论】:
@Jens:不,我只是没有涉及,因为它与手头的问题无关。是的,可能还有其他可能的方式调用 main ,但至少这两种是绝对允许的。是的,可以想象它可以返回一些其他类型,但 OP 似乎只关心参数,而不关心返回类型。 对不起,如果您感到冒犯。不过,从这句话可以看出,一个实现甚至可能允许版本int main()
带有任意数量的参数。
@JerryCoffin ,快速提问。如果函数是 f(),你将如何调用 Overload?我正在查看这个 locklessinc(dot)com/articles/overloading/ 示例,但您似乎需要一个参数。谢谢
@BluePython:我不确定我是否遵循您的要求。以上是关于C中main(void)和main()之间的区别[重复]的主要内容,如果未能解决你的问题,请参考以下文章
int main() 和 int main(void) 之间的区别?