在 C89 中,void main( ) 是正确的。Brian W. Kernighan 和 Dennis M. Ritchie 的经典巨著 The C programming Language用的就是main( )。
在最新的 C99 标准中,只有以下两种定义方式是正确的:
int main()
int main( int argc, char *argv[] )(参考资料:ISO/IEC 9899:1999 (E) Programming languages — C 5.1.2.2.1 Program startup)
如果你不需要从命令行中获取参数,请用 int main() ;否则请用 int main( int argc, char *argv[] ) 。
假设用户的命令由command执行,首先command把程序加入内存,然后设置CPU的CS:IP指向程序的第一条指令(也就是程序入口),从而使程序得以运行.程序结束后,返回到command中,CPU继续运行command.注意在返回的时候要有一个返回值,这样才能安全退出程序之后各寄存器会有恢复动作,如果没有返回值,虽然表面上看程序也正常结束了,但实际上它并没有退出,各寄存器并没有恢复,如CS:IP 还是指向程序尾部,如果得到CS:IP,那么可以让程序继续执行下去,但是所执行的程序已经不是你的代码所在的那段内存空间了,它在执行其它内存中的程序
main 函数的返回值类型必须是 int ,这样返回值才能传递给程序的激活者(如操作系统)。
如果 main 函数的最后没有写 return 语句的话,C99 规定编译器要自动在生成的目标文件中(如 exe 文件)加入 return 0 ,表示程序正常退出,譬如gcc3.2(Linux 下的 C 编译器)会在生成的目标文件中加入 return 0。但是不是所有的编译器都是如此做, 有的是提示错误, 有的会提示warning自动添加。
在 C 和 C++ 中,不接收任何参数也不返回任何信息的函数原型为“void func();”。可能正是因为这个,所以很多人都误认为如果不需要程序返回值时可以把main函数定义成void main(void) 。然而这是错误的!main 函数的返回值应该定义为 int 类型,C 和 C++ 标准中都是这样规定的。虽然在一些编译器中,void main 可以通过编译(如 vc6),但并非所有编译器都支持 void main ,因为标准中从来没有定义过 void main 。g++3.2 中如果 main 函数的返回值不是 int 类型,就根本通不过编译。而 gcc3.2 则会发出警告。所以,如果你想你的程序拥有很好的可移植性,请一定要用 int main .