29

谁能告诉我和之间的int main()区别int main(void)?为什么它们都有效,默认参数是int main()什么?

4

3 回答 3

14

一般情况下没有区别。这不是“main() 的默认参数”,因为它根本没有参数。

这是不寻常的情况。如果您自己编写对 main 的调用,()则将允许您将任何您喜欢的参数传递给它,而(void)将强制您不传递任何参数。尽管如此,就 99.99999999% 的情况而言,这些都不重要,运行时主要调用它来启动您的程序。运行时既不知道也不关心您是否编写()(void).

如果您对标准进行编码,int main(int argc, char **argv)您将在那里获得命令行参数。

于 2010-09-14T16:51:10.267 回答
8

main()允许您使用任意数量的参数调用 main。main(void)强制您在没有参数的情况下调用 main 。所以:

main(foo, bar);

可以,main()但不能main(void)- 编译器会生成错误。

现在,如果您专门询问程序的入口点,那并没有什么区别。在任何一种情况下,您都不会有程序的参数(argc、argv、envp)可用。

于 2010-09-14T16:51:29.303 回答
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();

指定 thatf是一个返回 的函数int,但提供有关f可能期望的参数数量或类型的信息(这主要是为了与旧代码兼容——曾经,这是在 C 中声明函数的唯一方法)。在 C++ 中,相同的声明显式声明f为不带参数的函数,因此尝试f使用一个或多个参数调用不能调用此函数(它必须调用另一个重载或如果找不到合适的重载则产生错误)。

于 2010-09-14T17:05:03.577 回答