回复 5楼 bcbbcclbbc
首先,C/C++标准中 Startup function 只有两种形式:
int main( void )
int main( int argc, char* argv[] )
然后一一来讲那些歪门邪道的形式
1. 不标示返回类型的,比如 main( void ) 等
这是因为古老的 K&R 中一切类型默认为 int,因此 main( void ) 其实等价于 int main( void ),
但是要记住,现在的C标准早就禁止此种行为了,不再有默认int类型的行为。
2. 参数列表瞎鸡巴填写的,比如 int main()、int main( double, float ) 等等
这是因为C语言没有“函数重载”的功能,因此LINK时内部符号不带有参数。即对链接器而言,它只知道函数名叫做main,无从得知其参数形式,即便参数形式是错误的,它也不知道,只能当作正确的处理。假如因为参数形式错误而导致运行时错误,那就不是它的过错了。
注:在C++中 int main() 形式是正确的,因为C++中函数参数列表为空,代表不接受任何参数,即 fun(void);而在C中,若函数参数列表为空,代表可接受任意多任意类型的参数,即 fun(...)。
3. void main 等
只存在于一些不正经的C编译器中,比如 trubo c 等垃圾编译器。
有些人会说C/C++标准也允许编译器实现自定义的格式,确实,但返回类型不在此列。因为main返回值是给调用者的,如果允许void,那么调用者就需要另外的手段知道被调用者是返回int还是其它。C/C++ 对编译器扩展的 Startup function 规定,返回类型必须是 int,若有第一参数,第一参数必须是 int 及其兼容类型,若有第二参数,第二参数必须是 char* argv[] 及其兼容类型。例如,VC++ 的 int main( int argc, char* argv[], char* envp[] ) 就属于符合C/C++标准的main扩展。