void main()
我发现我的C语言教材上都是void main () 的写法,但是现在遇见的代码里面都是 int main () 这样的写法,于是搜到了原因:书上使用了void main( ) ,其实这是错误的。C/C++ 中从来没有定义过void main( ) 。C++ 之父 Bjarne Stroustrup 在他的主页上的 FAQ 中明确地写着 “The definition void main( ) { /* … */ } is not and never has been C++, nor has it even been C.”
main函数是C-LIKE中最重要的函数
几乎每一程序中都会有main函数的身影,mian它影响着程序的编译和执行.我打算从main的运行之前和main运行之后的两个时间对它进行了解。
- main运行之前发生了什么
- main运行的最后是怎样的
main运行之前的事情
程序在运行之前,一般会经历编译、链接和运行的过程。这些过程可以理解为环境在为程序所要的所有的条件开始调用资源,那么调用的这件事情就是由系统自动创建立的_main函数来完成的,这个函数不会出现在代码中的。
_main在程序启动中干了什么
在看到_main函数时,我认为是main函数的别名或是编译之后的名字,否则在启动代码中再也无法找到和main相关的字眼了。但其实,_main和main是完全两个不同的函数!_main代码,因为这个是编译器自动创建的!可以查看MDK的文档,会发现有这么一句说明:It is automatically created by the linker when it sees a definition of main()。简单点来说,当编译器发现定义了main函数,那么就会自动创建_main。
其实_main主要做这么两件事:初始化C/C++所需的资源,调用main函数。初始化先暂时不说,但“调用main函数”这个功能能够让我们解决为什么启动代码调用的是_main
main 运行之后的事情
当main 成功的调用起了程序所要的其他文件之后,就与之产生了链接,让程序能够正常的运行,当程序结束后就会给系统一个返回值,来告知程序的运行结果。
main函数要求要拥有一个返回值,也就是return 0;着东西,这个返回值的数据类型是整数型会将所有的不同数据转化成为整型。返回值为0的时候,代表的程序正常运行退出,如果不是0,就是程序出了问题。
那为什么会有void main () 的书写方式
有一些书上的,都使用了void main( ) ,其实这是错误的。C/C++ 中从来没有定义过void main( ) 。C++ 之父 Bjarne Stroustrup 在他的主页上的 FAQ 中明确地写着 “The definition void main( ) { /* … */ } is not and never has been C++, nor has it even been C.”
这可能是因为 在 C 和 C++ 中,不接收任何参数也不返回任何信息的函数原型为“void foo(void);”。可能正是因为这个,所以很多人都误认为如果不需要程序返回值时可以把main函数定义成void main(void) 。然而这是错误的!main 函数的返回值应该定义为 int 类型,C 和 C++ 标准中都是这样规定的。虽然在一些编译器中,void main() 可以通过编译 (比如大一的时候用的vs 2005) 但并非所有编译器都支持 void main() ,因为标准中从来没有定义过 void main 。g++3.2 中如果 main 函数的返回值不是 int 类型,就根本通不过编译。而 gcc3.2 则会发出警告。所以,为了程序拥有很好的可移植性,一定要用 int main ()
那么不给定返回值的main 是不意味着返回为空呢,结果当然是否定的 ,因为规定:不明确标明返回值的,默认返回值为int,也就是说 main()等同于int main(),而不是等同于void
#include <stdio.h>
main()
{
printf("Hello world\n");
return 0;
}
这样他会默认返回值是int型,同时如果自己 返回值不是整型数据那么他会自动的进行强制转换。
main的官方规定的定义方式
在最新的C99++标准下,只有
int main (void)
int main (int argc,char *ardv[ ] )
这两种的定义方式是正确的,同样的他们的返回值也必须是int 型的