Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么不';我们不能主要使用(void)吗?_C - Fatal编程技术网

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[]) { /* ... */ }