可能重复:
Standard way to define parameter-less function main() in C
我可以在C中使用函数main()
的声明定义,如下所示:
int main() {}
是的,我看到该标准说只有两个保证支持的版本:
int main(void) {}
和
int main(int argc, char* argv[]) {}
但是空洞的做法呢?我知道它有另外的含义而不是在C ++中(在C中,它意味着这个函数的参数的数量和类型是未知的),但我在C中看到了很多带有声明定义的代码主要的。
那谁错了?
答案 0 :(得分:9)
在C中,声明 int main();
和int main(void);
之间存在差异(前者声明了一个带有未指定参数的函数,后者实际上称为原型)。但是,在函数 definition 中,main()
和main(void)
都定义了一个带 no 参数的函数。
另一个签名main(int, char**)
是替代表单。符合实现必须接受任何一种形式,但也可以接受main()
的其他实现定义的签名。任何给定的程序当然只能包含一个名为main
的单个函数。
答案 1 :(得分:3)
int main()
和这样的任何其他函数声明,它需要一个未知数量的参数,所以这对于main函数来说是绝对错误的。 int main(void)
它不需要任何参数。
char* argv[]
是 arg ument v ector。当您在命令行上编写参数时,您将在此向量字符串中找到参数。有时您也可以找到char **argv
,但它是相同的。括号[]
是空的,因为我们不知道有多少参数来自用户;为此目的存在int argc
arg ument c ount:它计算argv
中有多少参数(尽管列表以{{终止) 1}}也是一个哨兵值。)
另请阅读此link,了解通用argv[argc] == NULL
和foo()
答案 2 :(得分:2)
如果实现明确地将int main()
(没有参数)文档作为有效签名,那么从C99开始一切都很好(§5.1.2.2.1¶1,“......或者在其他一些实现中定义)方式。”)。
如果实现没有记录它,那么严格来说行为是未定义的(§4¶2),但它导致行为与int main(void)
显着不同的几率是根据我的经验,相当低调。
答案 3 :(得分:1)
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.