voidmain(void){}在C语言里面也是可以编译运行的,因为C语言的函数只看名字,不看返回类型,程序在寻找入口函数的时候只是寻找叫作“main"的函数,并不在乎它的返回类型和参数类型。
这也就是C语言不允许函数重载的原因,同名函数只是参数不同,在C语言眼里就是重复的函数符号。
voidmain在早期标准里面虽然有问题但可以用。这就是它存在的原因。然后,很多史前书籍撰写于C89标准制定之前,所以你会看到很多在现在看来不规范的用法。在C语言中voidmain算是implementation-defined,并不严格地算是违背语言标准。在C++中voidmain则严格违背了标准。
voidmain的却不那么规范,但对于大多数人来讲,这又有什么关系呢?写了voidmain,编译器也不见的就报错。并且很多人也并不需要真的向父进程返回一个值(因为很多人就是简单程序的开发者,不需要多个进程协作;或者压根就是写webservice的)
voidmain()这种写法,编译器也起了推波助澜的作用,君不见VC6.0以及VisualStudio+版本自带的编译器是认voidmain0这种写法的,不报错吗?
像gcc编译器就会报错,当我在Ubuntu环境下用Code:Blocks写C语言程序时,如果我用了voidmain0,编译阶段会报错说mainmustreturnint。我也是经历了这样的事情之后才彻底认识到voidmain()是错的,在此之前也只是听人家这么一说,并没有往心里去。
再说说规范本身。规范被打破的的事情多了去了。大多数人都是混口饭吃,怎么混得舒服怎么来,管他规范不规范。有的时候坚持规范只有“长期正反馈”(既坚持了很久才能看到好处,短期会很痛苦,如写好api文档)有的就是压根没什么正反馈,就是一种“口味”(比如变量名用驼峰还是下划线)。
对了,还有就是为单片机开发程序时,程序都是死循环永不终止的,那么既然不会返回给操作系统,这时候写成voidmain()完全正确。
返回值类型void表示函数本身没有返回值。也就是说,编译器返回时不需要关心ax系列寄存器的值。也就是说main没有对返回值是什么负责,但底层上依然能取它的“返回值”。至于编译器是否接纳,取决于它是否接纳你定义成这样。