C 中main(void)和main()之间的区别

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

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

这是不寻常的情况。 如果您自己编写对main的调用,则()将允许您传递任何您喜欢的参数,而(void)将强制您将其传递给none。 但是,对于99.99999999%的情况而言,这一点都不重要,这是运行时启动程序时调用的主要情况。 运行时既不知道也不关心write ()(void)

如果您编写标准的int main(int argc, char **argv)那么您将获得命令行参数。

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

 main(foo, bar); 

使用main()但不能使用main(void) – 编译器会生成错误。

现在,如果你特别询问该计划的切入点,它并没有真正有所作为; 在任何一种情况下,您都不会拥有该程序的参数(argc,argv,envp)。

从实际的角度来看,没有真正的区别。 使用int main(void) ,您明确声明main接受任何参数,因此您无法使用any调用它。 使用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的函数,但是没有提供关于f可能期望的参数的数量或类型的信息(这主要是为了与旧代码兼容 – 一次,这是声明函数的唯一方法) C)。 在C ++中,同一个声明显式地将f声明为不带参数的函数,因此尝试使用一个或多个参数调用f不能调用此函数(如果没有找到合适的重载,它必须调用另一个重载或产生错误)。