该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
Dairy 2/21 Declaration of Main
开始学C了,在C吧看了看,发觉,还是有很多人喜欢用void main(),好吧,这与我无关。但是,还是喜欢能够帮到大家。当然,如果有人认为我说的不对,私底下骂就可以了。
话说我还是一个菜鸟的时候,第一个知道的C知识就是每个C程序都要有一个main(),可是,我发现,关于main()的使用,版本实在是太多了,比如:
• main()
• main(void)
• void main()
• void main(void)
• int main()
• int main(void)
• main(int argc, char* argv[])
• int main(int argc, char* argv[])
• int main(int argc, char** argv)
and so on
于是乎,我抑郁了。
在C++正式入门后,这个问题总算是解决了。
一个C/C++程序编译成exe后,由系统调用,一些系统会要求exe程序执行完后返回一个值,表明程序的执行状态。比如Unix,MS-Dos。
也就是说,main()必须有返回值!虽然某些时候,没有返回值也不会出错。(有时,这个返回值系统可能不需要,但它要不要是一回事,你给不给就是另外一回事了,性质不一样。要是敢不给。。。)
在C标准中,main()只有两种合法声明:
Int main(void)
Int main(int argc, char* argv[]) (char* argv[]有许多不同的写法)
那么,为什么有那么多的main()版本呢?
在C中,当没有指定返回值类型时,默认返回值为int,所以,main()和main(void)的写法很常见,它们与前者是一样的,都会返回int。(TCPL中用的就是main())。
那个括号里的void又是怎么回事呢?它说明这个函数没有参数。
在很早的C中,f(),并不意味着函数f没有函数,而是说,它可以接受任意参数,相当于f(…),在新的C中,为了和以前的C兼容,保留了这种用法。但这妨碍了函数的参数一致性检查。为了表示函数没有参数,引入了void符号,表示没有参数。(不过后来这被认为不是好的设计,它不但丑,而且逻辑上是多余的。所以C++中不用了)
综上,我推荐使用int main()。(这里就不使用int main(void)了)
(main()在C++中不能用,因为C++不支持默认返回类型为int,C为了C++兼容,这种用法也不用了)
记住,要在main()函数体末尾加上return 0;(返回0表示程序正常执行)。不过这有时是多余的,多数编译器会自动帮你加上。所以TCPL中,都没有return 0;但最好还是写上,这样代码意图更加明确。特别是有些编译器在你没写时会报错(“main没有返回值“)。。。有些自作聪明的人为了防止报错,就发明了这种写法:void main(),然后。。。就不会报错了,再然后,它流传开了,更糟的是,有些时候,编译出的程序还能够用。。。
那么,如此声明会带来什么严重的后果呢?它可能让程序无法执行!!!(调用者可能不会理这个程序)。(还有万分之一的例外(参见宿主实现和独立实现),不要去想它)
另外,为了能与C++兼容,我们也不应该使用void main(),这种用法在C++中是绝对错误的。
最后,解释一下这个问题,为什么那么多书都用了void main()。
应该说,他们是很不负责任的,他们没有按照C标准来写代码。使用void main()的写法,原因大概有:
• 编译器经常提示”main 没有返回值”,有的人嫌烦,用了void,而且在他的机子上正好可以运行,于是乎。。。
• 看别人这么用,自已也就这么用了。(他们可能都没有在编译器上亲手实验过自己写的书中的代码,或者只在一个环境下试过,这是很不负责任的。好的书上的代码会在至少两种编译器上进行测试)