科研和工程中的C++编程2_代码编写_第1页
科研和工程中的C++编程2_代码编写_第2页
科研和工程中的C++编程2_代码编写_第3页
科研和工程中的C++编程2_代码编写_第4页
科研和工程中的C++编程2_代码编写_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、科研和工程中的科研和工程中的C+编程编程代码编写浙江大学计算机学院浙江大学计算机学院袁昕袁昕代码编写v代码编写注意点:(1)国际化要考虑到软件可能在其他国家的操作系统下运行。软件中的字符串要替换成其他语言。因此程序中最好使用UNICODE字符串。windows下数据类型是WCHAR, 类可以用CStringW类,或者STL的wstring。为了兼容工程设置,可以用CString类,常字符串用_T(“AAA”)宏表示。linux下用wchar_t数据类型以及STL的wstring。代码编写 windows下的国际化可以使用资源DLL来实现。把需要翻译的字符串都放到资源里,用整数来标识,在程序中装

2、载资源来获得字符串。将资源文件翻译成其他国家的语言后生成新的DLL,主程序根据需要装入具体语言的资源DLL,通过相同的整数标识来获得需要的字符串*。 Qt下编程是使用特殊的宏来标识常字符串,并用工具翻译成其他国家的语言。代码编写 (2)注意x64兼容性 x64系统会慢慢成为主流,因此写程序要能够平滑地过渡,所以代码要有x64兼容性。除了数据类型要保证正确使用外,还要注意指针类型在x64下成为64位,因此要注意指针类型的比较、加减以及和整数类型的转换。代码编写windowslinuxINT_PTRUINT_PTRLONG_PTRULONG_PTR DWORD_PTRlong intunsigne

3、d long int可以和指针类型转换的平台相关整数类型:代码编写 (3)内存问题 一定要仔细检查代码,防止内存泄露(leakage)。函数内局部变量是占用栈上的内存,动态分配内存malloc等是使用堆上的内存,最终是进程空间中的页面。要保证类的析构函数释放类成员占用的资源。在每个方法/函数结束时检查这些内存使用情况并适当释放。 也可使用自动指针对象CAutoPtr/auto_ptr来管理动态内存的使用,引用计数共享指针对象share_ptr来管理多处引用的动态内存, COM接口使用CComPtr*。代码编写 (4)异常处理有些程序往往要连续运行数年不能停机(如工厂自动化数据采集和控制程序、网

4、络服务程序),所以要保证程序的可靠性,就必须处理异常。需要处理的异常包括:操作系统异常(如windows下的结构化异常SEH)、函数接口调用异常(如数学库、内存分配等提供使用回调函数作为异常处理接口)、C+语言中的异常(try,catch等)。异常处理粒度要掌握好,不可过粗过细,保证程序不会中途退出。代码编写 析构方法不能抛出异常,这是因为在异常处理时会自动调用栈上的对象的析构方法,此时再次抛出异常会破坏当前正在处理的异常链。 构造函数尽量不抛出异常,如果一定要抛出异常,要注意该对象new之后的实例,一定要赋给一个自动指针对象,否则就会出现内存泄露*。代码编写 (5)整数要注意计算过程中可能会

5、溢出,要做溢出处理。如要分配一块内存,设内存大小用int nSize表示,在计算中若(UINT)nSize INT_MAX,此时nSize0,再传入malloc函数就不正确了。如果有两个UINT n1, n2; UINT n = n1 + n2; 通过判断n n1 或者n n2就可知道发生了溢出。此外还要注意不同类型的整数间的计算和比较。代码编写windowslinuxrangeCHARcharSCHAR_MINSCHAR_MAXUCHAR,BYTEunsigned char0UCHAR_MAXSHORTshort intSHRT_MINSHRT_MAXUSHORT,WORDunsigned

6、short int0USHRT_MAX代码编写windowslinuxRangeINT,LONGintINT_MININT_MAXUINT,ULONG,DWORDunsigned int0UINT_MAXINT64,LONG64,LONGLONGlong long intLLONG_MINLLONG_MAXUINT64,ULONG64,ULONGLONGunsigned long long int0ULLONG_MAX代码编写可以使用ATL提供的内联函数:AtlAddAtlAddThrowAtlMultiplyAtlMultiplyThrow 通过检查返回值或者捕获异常来获知整数运算是否溢出*

7、。代码编写 (6)浮点数有三种,单精度(float, FLOAT),双精度(double, DOUBLE),长精度(long double, LDOUBLE)。一些常量(float.h)如下(Linux下这些宏改为前后加双下划线):FLT_MINDBL_MINLDBL_MINFLT_MAXDBL_MAXLDBL_MAXFLT_EPSILON DBL_EPSILON LDBL_EPSILON代码编写 要注意浮点运算会产生上溢、下溢、非有效数、正负无穷大等特殊数值,也可能抛出异常,要查阅每个调用的手册,看是什么类型的异常并进行合适的处理。 常量单精度浮点要在末尾加f,如float k = 0.1f

8、; 处理时也要调用相应的数学函数,这些函数的末尾都加了f,如sqrtf*。代码编写 判断浮点数相等,要使用EPSILON,因为十进制数的二进制表示形式可能不精确。首先两个浮点数类型必须相同,然后比较它们的绝对差是否小于 EPSILON,可以使用常数FLT_EPSILON或者DBL_EPSILON。这些常数被定义为最小的正数x,因此 x+1.0 不等于 1.0。因为这是非常小的数,所以对于涉及大数的计算应采用用户定义的公差。代码编写 对于货币数据,当数值很大时(亿为单位),使用double也无法满足精度要求,此时可以使用其它类型来描述。Windows下使用结构CURRENCY和相关API函数,l

9、inux下用monetary.h里的函数。代码编写 (7)尽量使用操作系统提供的编程接口来写代码。对于CRT运行库中的调用,若操作系统提供了相同功能的接口,则使用操作系统的接口能使代码运行效率更高。因此要勤查MSDN(windows编程)和man(Linux编程),熟悉和了解基本的系统调用和编程接口。对每个调用都要检查输入/输出参数的有效性,返回值也要检查。当编写的函数/方法返回错误时,要保证清理已作的工作,回复调用前的情况。 例如:如对文件操作,windows下用IStream接口调用,linux下用open,close,read,write.lseek这套系统调用。而不是直接去使用CRT运

10、行库的FILE*这套函数*。代码编写 (8)要注意在代码中加入调试语句,如assert, verify等系列,以及MFC和ATL中相应的宏。这些语句可以帮助程序员在debug阶段查出程序内在的错误。在编译程序的release版本时这些语句不会进入最后的代码。 在函数体内检查输入参数的有效性成为防御性编程,在函数调用前检查准备输入的参数的有效性称为契约式编程。尽量后者*。代码编写 (9)递归函数/方法尽量不设计和使用递归函数/方法,除了特殊情况(如算法本身只能用递归描述,或者递归算法的非递归形式不容易实现)。因为某个线程的栈空间是很少的,当递归函数的调用层次较深时,将发生栈溢出,进而程序崩溃。可

11、使用递推的方法和在堆上分配内存的动态栈来模拟实现递归函数。代码编写 可以写成递推形式的算法就可以非递归化,如阶乘的实现、二叉树的遍历等。 一些ATL和STL中的集合类,如CRBMap/map等都使用了递归算法,可自行查看源代码,尝试改写成非递归形式。代码编写 (10)注意各种类型的实例的生存周期。在函数/方法体内定义的栈上变量的生存周期就是在方法体内,在语句块内部定义的变量的生存周期是在语句块内,类/结构的成员变量的生存周期和类/结构相同,取决于类/结构的实例如何定义。如果实例建立在堆上,那么当程序释放这块内存时,实例的生存周期才结束*。代码编写 (11)代码编写风格代码的编写风格直接影响到代

12、码的维护、查看、调试、分析等。风格不好的代码会难以维护和查错,从而进一步影响到软件的开发时间和成本。好的代码风格更像一门艺术,能得到美的感受。代码编写 要有一双发现美的眼睛,看看周围世界什么是美的事物。上一些人文方面课程,如绘画、文学、哲学等,提高美的修养。 任何技艺,如理发、木工、武术等都是在熟练基础上,寻找自己的创新点,最后升华变成一门艺术,得到美的感受。编程也不例外。要在编程外求编程,最后沉浸其中,人与编程溶为一体。代码编写和优化形成该画美的要素和编程对比绘画编程笔画粗细、浓淡变量、函数、类的命名风格;设计类以描述实际问题布局:对比、呼应、穿插、挪让各种基本元素如类、方法、变量、函数在文件中的顺序;类之间的关系附注和印章文档化注释(用doxygen来自动生成文档)代码编写代码编写 要多读源代码。根据问题去网上(google,baidu,wiki)搜解决的方法,并学习他们的编程风格,有的风格可能你很喜欢,就可以模仿,其他风格也要兼收其合理的地方(不盲从)。然后在实际的编程中积累经验,不断揣摩,探索和创造适合自己的编程风格,从中得到美的感受*。(匈牙利命名,大小写相间,全小写下划线连接,动宾词组,名词,循环变量简单命名)代码编写(12) 运用软件工程思想:需要一个源代码控制软件(如SourceSafe, SVN, GIT, Foss

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论