可能是重复问题:
在C语言中定义无参函数main()
的标准方式
我可以使用以下类似的函数main()
的定义方式吗:
int main() {}
是的,我看到该标准规定只有两个版本得到了保证支持:
int main(void) {}
并且
int main(int argc, char* argv[]) {}
但是空括号呢?我知道它与C++中的含义不同(在C中,它表示此函数的参数数量和类型未知),但是我看到很多用这种方式定义main函数的C代码。
那么谁错了?
可能是重复问题:
在C语言中定义无参函数main()
的标准方式
我可以使用以下类似的函数main()
的定义方式吗:
int main() {}
是的,我看到该标准规定只有两个版本得到了保证支持:
int main(void) {}
并且
int main(int argc, char* argv[]) {}
但是空括号呢?我知道它与C++中的含义不同(在C中,它表示此函数的参数数量和类型未知),但是我看到很多用这种方式定义main函数的C代码。
那么谁错了?
int main();
和int main(void);
这两个声明有所不同(前者声明一个具有未指定参数数量的函数,而后者实际上称为原型)。然而,在函数定义中,main()
和main(void)
都定义了一个没有参数的函数。main(int, char**)
是一种替代形式。符合规范的实现必须接受任何一种形式,但也可以接受其他实现定义的main()
签名。当然,任何给定程序只能包含一个名为main
的函数。char *envp[]
,该参数指向一个以空指针结尾的 char 指针数组,每个指针都指向一个字符串,该字符串提供有关程序执行环境的信息(5.1.2.2.1)。 - Jonathan Lefflermain()
可以带有未知数量的参数;只有main(void)
不带参数。 - Federicoint main() {...}
的定义确实定义了一个没有参数的函数,但它本身并没有引入 main
的原型。也就是说,在这样的定义之后,main
仍然被声明为具有未指定参数的函数。 "无参数" 部分仅影响 main
函数体。 - AnT stands with Russiaint main()
和其他类似的函数声明都可以接受未知数量的参数,但对于主函数来说这是绝对错误的。正确的写法应该是 int main(void)
,它不需要任何参数。
char* argv[]
是参数向量。当你在命令行中输入参数时,这些参数会被存储在这个字符串数组中。有时候也可以看到 char **argv
,但其实是一样的。方括号 []
是空的,因为我们不知道用户会输入多少参数,而 int argc
参数计数就是为了解决这个问题:它统计了 argv
中有多少个参数(虽然列表以 argv[argc] == NULL
作为结束标志)。
还可以阅读这个链接了解一个通用的 foo()
和 foo(void)
的区别。
int main()
是有问题的;在函数定义中(其中也提供了函数体),它表示该函数不带参数,但没有提供函数的原型声明,因此如果您递归调用 main()
,则无法防止您进行不正确的调用。这通常不是一个主要问题! - Jonathan Lefflerint main(){}
更应该避免。 - AProgrammerint main()
(没有参数)文档化为有效签名,则自 C99 以来一切都很好(§5.1.2.2.1 ¶1,“...或以某种其他实现定义的方式。”)。int main(void)
显着不同的行为的可能性非常小。 int main() {}
this is the standard prior to the c99 standard of main method.
int main(void){}
this is the standard coined by ANSI.
int main(int argc, char* argv[]) {}
This is the another version of main which provides the user to pass the command line
argument to the main method.