C 为什么不';我们不能主要使用(void)吗?
人们使用C 为什么不';我们不能主要使用(void)吗?,c,C,人们使用void main()/*空parens()*/ 我被教导写void main(void) 有什么区别吗?我不确定现在的标准是什么,但在传统的ANSI C中,使用空括号表示函数可以接受任意数量的参数。另一方面,声明void参数表示函数只接受零参数。在这种情况下(以及其他许多情况下),这真的不太重要 但是,如果希望严格,最好定义void参数。当然,main函数也可以定义为intmain(int-argc,const-char*argv[]),这是完全有效的,但如果您不关心参数,通常是不必要
void main()/*空parens()*/
我被教导写void main(void)
有什么区别吗?我不确定现在的标准是什么,但在传统的ANSI C中,使用空括号表示函数可以接受任意数量的参数。另一方面,声明
void
参数表示函数只接受零参数。在这种情况下(以及其他许多情况下),这真的不太重要
但是,如果希望严格,最好定义
void
参数。当然,main
函数也可以定义为intmain(int-argc,const-char*argv[])
,这是完全有效的,但如果您不关心参数,通常是不必要的。没有区别,但通常main应该返回int。一些编译器会给您一个警告(至少GNU编译器-gcc):
如前所述,main的原型为(根据标准):
intmain(intargc,constchar*argv[])
main()的这些原型都是非标准的
有关该问题的详细信息,请访问comp.lang.c常见问题解答:
编辑:将“错误”更改为“非标准”,因为规范允许实现定义的原型。
main
是一个函数,与其他函数一样。几乎。无论如何,作为一个函数,它被其他代码(启动代码)调用。通常(阅读:几乎总是)int main()
是正确的,但真正正确的是什么取决于您使用的平台。因为,如前所述,main函数可以由启动代码调用,启动代码根本不传入任何参数,并且不希望在特定寄存器中返回值(因此void main(void)
是正确的)
int main()
是正确的,因为通常启动代码需要返回值,并传入两个参数。说intmain(void)
就是说main根本不带参数,在大多数情况下这是错误的。使用()
时,你说有参数(一、二、三,你不在乎),但你对它们不感兴趣,所以你不想说它们是什么,它们是什么类型
正如我在代码中所看到的,当忽略传递的int argc,char**argv
参数时,“正常”环境(没有嵌入式设备或其他可以以不同方式调用main的“奇怪”环境)最常用的原型是int main()
。(因为我们使用的是适合环境的GCC版本;在启动代码不传递任何参数且不期望返回值的环境中,使用跨GCC版本对其进行测试)
编辑
善待持怀疑态度的人;在使用两个参数调用main函数的环境中,如下所示
int func()
{
return 0;
}
int func2(void)
{
return 1;
}
int main(void)
{
int a;
a = func(a, a); /* A */
a = func2(a); /* B */
return 0;
}
表示A没有错误,而B表示函数“func2”的参数太多,使用gcc-std=c99-pedantic
编译。将int main(void)
更改为int main()
没有区别,也没有警告
在其他环境中(我现在无法进行实际测试),voidmain(void)
是可以的,但在本例中它会发出警告。警告并不仅仅是因为标准,而是因为在使用的环境中,main的原型不匹配。标准似乎允许任何其他“配置”的主要
在OP的情况下,考虑到“正常”环境(例如GNU/Linux之类的O.S.),其中两个参数被传递给main,并且需要返回值,int main()
更可取(无论您是否说int main(void)
,参数都由启动代码推送到堆栈上,因此int main()
对我来说更有意义)
编辑
还有一个注意事项,总是针对持怀疑态度的人。正如已经证明的那样,B引发了一个错误,因为我说过它是int func2(void)
,但我称之为传递参数。然后,让我们假设我们可以编译启动代码并将其链接,就像其他代码一样。在某个地方,它会调用main,就像
retval = main(argc, argv);
如果我们使用intmain(void)
,编译器将停止,并给出一个错误,因为启动代码(在此环境中)正试图使用两个参数调用main。如果我们使用int main()
什么都不会发生,代码也会正确编译
因此,intmain()
比intmain(void)
优越(在我们希望main可能有两个参数的环境中)
编辑
更可能的情况是
retval = main(_argc, _argv, environ);
在许多系统上,但这不会改变以前的讲话
最终编辑
是否有人发现,当使用intmain(void)
构建命令行工具(即在intargc,char**
有意义的系统上)时,所选编译器/链接器链接一个启动代码,其中调用main
时不带参数(无论调用约定是什么),而是使用intmain构建时(int argc,char**argv)
启动代码不同,实际上使用这两个参数调用main
(即使main
本身不使用它们)?来自C99标准:
5.1.2.2.1程序启动
在程序启动时调用的函数名为main
此函数的原型。应使用返回类型int和no进行定义
参数:
int main(void) { /* ... */ }
或者使用两个参数(此处称为argc和argv,但可以使用任何名称)
使用,因为它们是声明它们的函数的本地函数):
或同等产品;或以其他实现定义的方式
您不应该使用这两种方法。
main
的正确签名通常是intmain(intargc,char*argv[])int main(void) { /* ... */ }
int main(int argc, char *argv[]) { /* ... */ }