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

时间:2010-09-14 16:48:08

标签: c main

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

3 个答案:

答案 0 :(得分:12)

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

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

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

答案 1 :(得分:8)

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

main(foo, bar);

main()main(void)没问题 - 编译器会生成错误。

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

答案 2 :(得分:3)

从实际的角度来看,没有真正的区别。使用int main(void),您明确声明main不带参数,因此您无法使用任何参数调用它。使用int main(),您可以通过一些参数调用main

但是,除了代码高尔夫或有意混淆的代码之类的奇怪情况之外,你无论如何也不会调用main - 它是程序的入口点,因此启动代码会自动调用它。启动代码无论如何都会传递命令行参数,因此您的选择不会改变它的调用方式,只会改变您是否使用或忽略传递的参数。

标准确实允许您定义带有或不带参数的main(§5.1.2.2.1/ 1):

  

程序启动时调用的函数名为main。实施宣布否   这个功能的原型。它应该使用返回类型int和no来定义   参数:

    int main(void) { /* ... */ }
  

或有两个参数(这里称为argc和argv,但可能有任何名称   使用,因为它们是声明它们的函数的本地函数):

    int main(int argc, char *argv[]) { /* ... */ }
  

或同等的;

虽然它超出了指定的标签,但在C ++中情况略有不同。在C中,函数声明如:

int f();

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