我可以在 C 中使用函数的声明定义,如下所示:main()
int main() {}
是的,我看到该标准说只有两个保证支持的版本:
int main(void) {}
和
int main(int argc, char* argv[]) {}
但是空虚又如何呢?我知道它与 C++ 中的含义不同(在 C 中,这意味着该函数的参数的数量和类型是未知的),但是我在 C 中看到了很多带有main声明定义的代码。
那么谁错了?
我可以在 C 中使用函数的声明定义,如下所示:main()
int main() {}
是的,我看到该标准说只有两个保证支持的版本:
int main(void) {}
和
int main(int argc, char* argv[]) {}
但是空虚又如何呢?我知道它与 C++ 中的含义不同(在 C 中,这意味着该函数的参数的数量和类型是未知的),但是我在 C 中看到了很多带有main声明定义的代码。
那么谁错了?
In C, there's a difference between the declarations int main();
and int main(void);
(the former declares a function with an unspecified number of arguments, and the latter is actually called a prototype). However, in the function definition, both main()
and main(void)
define a function that takes no arguments.
The other signature, main(int, char**)
, is an alternative form. Conforming implementations must accept either form, but may also accept other implementation-defined signatures for main()
. Any given program may of course only contain one single function called main
.
int main()
和任何其他这样的函数声明,它需要未知数量的参数,所以这对于主函数是绝对错误的。int main(void)
它不需要任何参数。
char* argv[]
是自变量 向量。当你在命令行上写你的参数时,你会在这个字符串向量中找到参数。有时你也可以找到char **argv
,但它是一样的。括号[]
是空的,因为我们不知道有多少参数来自用户;为此目的存在int argc
参数计数:它计算有多少参数(argv
尽管列表也以标记值终止argv[argc] == NULL
)。
另请阅读此链接以了解通用foo()
和foo(void)
如果实现明确记录int main()
(没有参数)作为有效签名,那么从 C99 开始,一切都很好(§5.1.2.2.1 ¶1,“......或以其他一些实现定义的方式。”)。
如果实现没有int main(void)
记录它,那么严格来说行为是未定义的(§4 ¶2),但根据我的经验, 它导致行为显着不同的几率非常低。
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.