只是想知道为什么这个
int main(void){}
编译和链接
这样做:
int main(int argc, char **argv){}
为什么它不是一个或另一个?
gcc甚至会编译并链接一个参数:
int main(int argc){}
但是用-Wall:
发出此警告smallest_1.5.c:3:1: warning: ‘main’ takes only zero or two arguments [-Wmain]
我不是在问这个问题,他们怎么允许这个?"但是在"调用者和链接器如何处理main的多种可能性?"
答案 0 :(得分:0)
简短的回答:如果您不使用参数,那么您可以通过两种方式声明不带参数的main:
int main(void)
或
int main()
第一种方法main
是一个没有参数的函数。第二种方法main
是一个包含任意数量参数的函数。
由于您无法访问参数,因此两者都可以。任何具有"特殊"的编译器用于检查main
参数的代码是错误的。 (但是:main
必须返回一个值。)
答案 1 :(得分:0)
让它发挥作用与binary format和操作系统executable的loader有关。链接器并不关心(它关心一点:它需要标记入口点)并且唯一的调用者例程是加载器。
任何系统的加载器必须知道如何将支持的二进制格式带入内存并分支到入口点。系统和二进制格式略有不同。
如果您对特定的操作系统/二进制格式有疑问,可能需要澄清一下。