关于c语言的voidmain

上传人:自*** 文档编号:79772418 上传时间:2019-02-18 格式:DOC 页数:59 大小:300.30KB
返回 下载 相关 举报
关于c语言的voidmain_第1页
第1页 / 共59页
关于c语言的voidmain_第2页
第2页 / 共59页
关于c语言的voidmain_第3页
第3页 / 共59页
关于c语言的voidmain_第4页
第4页 / 共59页
关于c语言的voidmain_第5页
第5页 / 共59页
点击查看更多>>
资源描述

《关于c语言的voidmain》由会员分享,可在线阅读,更多相关《关于c语言的voidmain(59页珍藏版)》请在金锄头文库上搜索。

1、关于C语言的void main()作者:admin 发布时间:2012-02-13 17:41 来源:C语言中文网 人围观 分享到:QQ空间新浪微博人人网腾讯微博豆瓣15很多人甚至市面上的一些书籍,都使用了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.( void main( )从来就不存在于C+或者

2、C)。下面我分别说一下C和C+标准中对main函数的定义。一、 C语言中的main()在C89中,main( )是可以接受的。Brian W. Kernighan和Dennis M. Ritchie的经典巨著The C programming Language 2e(C 程序设计语言第二版)用的就是main( )。不过在最新的C99标准中,只有以下两种定义方式是正确的:int main(void)int main(int argc, char *argv)(参考资料:ISO/IEC 9899:1999 (E) Programming languages ? C 5.1.2.2.1 Progra

3、m startup)当然,我们也可以做一点小小的改动。例如:char *argv可以写成char *argv;argv和argc可以改成别的变量名(如intval和charval),不过一定要符合变量的命名规则。如果不需要从命令行中获取参数,请用int main(void);否则请用int main(int argc, char *argv)。main函数的返回值类型必须是int,这样返回值才能传递给程序的调用者(如操作系统)。如果main函数的最后没有写return语句的话,C99规定编译器要自动在生成的目标文件中(如exe文件)加入return 0;,表示程序正常退出。不过,我还是建议你最

4、好在main函数的最后加上return语句,虽然没有这个必要,但这是一个好的习惯。注意,vc6不会在目标文件中加入return 0;,大概是因为vc6是98年的产品,所以才不支持这个特性。现在明白我为什么建议你最好加上return语句了吧!不过,gcc3.2(Linux下的C编译器)会在生成的目标文件中加入return 0;。二、 C+中的main()C+98中定义了如下两种main函数的定义方式:int main( )int main(int argc, char *argv)参考资料:ISO/IEC 14882(1998-9-01)Programming languages ? C+ 3.

5、6 Start and terminationint main( )等同于C99中的int main(void);int main(int argc, char *argv)的用法也和C99中定义的一样。同样,main函数的返回值类型也必须是int。如果main函数的末尾没写return语句,C+98规定编译器要自动在生成的目标文件中加入return 0;。同样,vc6也不支持这个特性,但是g+3.2(Linux下的C+编译器)支持。三、 关于void main()在C和C+中,不接收任何参数也不返回任何信息的函数原型为“void foo(void);”。可能正是因为这个,所以很多人都误认为如

6、果不需要程序返回值时可以把main函数定义成void main(void)。然而这是错误的!main函数的返回值应该定义为int类型,C和C+标准中都是这样规定的。虽然在一些编译器中,void main可以通过编译(如vc6),但并非所有编译器都支持void main,因为标准中从来没有定义过void main。g+3.2中如果main函数的返回值不是int类型,就根本通不过编译。而gcc3.2则会发出警告。所以,如果你想你的程序拥有很好的可移植性,请一定要用int main。不要用“我的老师告诉我这么做是对的”之类的话来为自己开脱;老师们总是习惯犯错误(teachers have a bad

7、 habit of being wrong)。写安全的,合乎标准的代码,大家就可以专注于你程序中其它的问题而不是在这种规范方面的东西上浪费时间。应当指出:在某些系统中,若程序使用void main定义或没有return值,则可能导致堆栈异常从而导致系统故障。(详见后面英文部分)四、返回值的作用main函数的返回值用于说明程序的退出状态。如果返回0,则代表程序正常退出;返回其它数字的含义则由系统决定。通常,返回非零代表程序异常退出。下面我们在winxp环境下做一个小实验。首先编译下面的程序:int main(void)return 0;然后打开附件里的“命令提示符”,在命令行里运行刚才编译好的可

8、执行文件,然后输入“echo %ERRORLEVEL%”,回车,就可以看到程序的返回值为0。假设刚才编译好的文件是a.exe,如果输入“a & dir”,则会列出当前目录下的文件夹和文件。但是如果改成“return -1”,或者别的非0值,重新编译后输入“a & dir”,则dir不会执行。因为&的含义是:如果&前面的程序正常退出,则继续执行&后面的程序,否则不执行。也就是说,利用程序的返回值,我们可以控制要不要执行下一个程序。这就是int main的好处。如果你有兴趣,也可以把main函数的返回值类型改成非int类型(如float),重新编译后执行“a & dir”,看看会出现什么情况,想想

9、为什么会出现那样的情况。顺便提一下,如果输入a | dir的话,则表示如果a异常退出,则执行dir。五、那么int main(int argc, char *argv, char *envp)呢?这当然也不是标准C/C+里面定义的东西!char *envp是某些编译器提供的扩展功能,用于获取系统的环境变量。因为不是标准,所以并非所有编译器都支持,故而移植性差,不推荐使用除非你的程序是专门设计用于工作在特定的环境中而且需要获取系统的环境变量。在C语言有一定基础之后,怎么样能够更快的成长?作者:admin 发布时间:2012-02-13 18:49 来源:C语言中文网 人围观 分享到:QQ空间新浪

10、微博人人网腾讯微博豆瓣0这个问题比较常见,通常在程序语言有了一定基础之后,成长最快的方法就是多编程序,没有其他任何捷径,在实践中碰到问题/排查问题,提高程序的实现能力和调试能力,在实践中自然而然将各种知识融会贯通,在实现程序的过程中注意体会每个问题的解决方法以及每个Bug的排除方法,实践能力提高了,程序设计的技巧和能力也就提高了.祝大家的程序越写越好!写好C程序的10条秘籍作者:admin 发布时间:2012-02-15 18:22 来源:C语言中文网 人围观 分享到:QQ空间新浪微博人人网腾讯微博豆瓣16神乎其技,惟C程序,功到自成,十大建议!1. 汝应频繁催动lint工具,据其语法声明修习

11、内力,此事皆因lint之思虑决断实远在君上。2. 不可依随NULL指针,如若不然,混沌痴颠必俟君于彼岸。3. 纵有天赋大智慧,知晓其事无碍,汝亦当尽数强制挪移函数参数为原型所期之数据类型,以免一时疏忽,致使数据类型向汝讨还血债。4. 若头文件未于函数原型之中声明返回值类型,汝当亲为此事,更须谨慎再三,以防不测降临汝身。5. 汝须亲核字符串、数组操作之越界与否。古之圣人有言: 尝祈门人对答“然也”,不意门人答曰“吾了然于胸无须多虑尽请宽心他日趋庭必当重谢”所期者短,所获者长,此于数组,实最险要处也。6. 若函数声明内提及,于异常时将返回错误代码云云,汝当谨慎校核该返回值。或有校核语句使汝之代码增

12、大数倍,令汝之手指因敲键而痛楚莫名之事,汝亦当如此。不然,汝固以为此异常之事难得一见,上苍亦必借此惩戒汝之傲慢。7. 汝应研习库函数,不当亲笔重写之。如是,汝之代码必短小易读,汝之心境必清爽恬淡。8. 纵汝不愿,汝亦应借括号、缩进之属,使汝之代码间架清晰,可为后者借鉴。汝之大智慧施于决疑解难则可,施于敷设谜团、淆乱文体则万万不可。9. 外部标识符之前六字符当与众不同。此律法看似粗陋,和者寥寥,然其效用自能延续永远。汝若不从此言,他日,汝欲连接程序于旧作之上时,必抓耳挠腮、蓬头垢面,狼狈之相尽现矣。10. 或有族类,大言炎炎,云“普天之下,莫非VAX”。于此等异端,汝当摒弃之、断绝之、远避之。更

13、有异人,笃信魔道,以为纵汝所用电脑频繁换代,汝之程序亦能长久适用。汝亦不可与此类恶人来往,谨记谨记C语言中史上最愚蠢的Bug作者:admin 发布时间:2012-02-15 18:59 来源:C语言中文网 人围观 分享到:QQ空间新浪微博人人网腾讯微博豆瓣8本文来自“The most stupid C bug ever”,很有意思,分享给大家。我相信这样的bug,就算你是高手你也会犯的。你来看看作者犯的这个Bug吧。首先,作者想用一段程序来创建一个文件,如果有文件名的话,就创建真正的文件,如果没有的话,就调用?tmpfile()?创建临时文件。他这段程序就是HTTP下载的C程序。code=20

14、0就是HTTP的返回码。else if (code = 200) / Downloading whole file/* Write new file (plus allow reading once we finish) */g = fname ? fopen(fname, w+) : tmpfile(); 但是这个程序,只能在Unix/Linux下工作,因为 Microsoft 的?tmpfile()的实现?居然选择了 C: 作为临时文件的存放目录,这对于那些没有管理员权限的人来说就出大问题了,在Windows 7下,就算你有管理员权限也会有问题。所以,上面的程序在Windows平台下需要用

15、不同的方式来处理,不能直接使用Windows的tmpfile()函数。于是作者就先把这个问题记下来,在注释中写下了FIXME:else if (code = 200) / Downloading whole file/* Write new file (plus allow reading once we finish) */ FIXME Win32 native version fails here because/ Microsofts version of tmpfile() creates the file in C:g = fname ? fopen(fname, w+) : tmpfile(); 然后,作者觉得需要写一个跨平台的编译:FILE * tmpfile ( void ) #ifndef _WIN32return tmpfile();#else/code for Windows;#endif然后,作者觉得这样实现很不好,会发现名字冲突,因为这样一来这个函数太难看了。于是他重构了一下他的代码写一个自己实现的tmpfile()

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号