CppCodeStandard

合集下载

VSCode配置c_cpp_properties.json文件

VSCode配置c_cpp_properties.json文件

VSCode配置c_cpp_properties.json⽂件1.安装C/C++ for Visual Studio Code点击左边扩展栏图标—>搜索C/C++ -> 安装->Reload:安装完成之后,打开你的包含c++的⽂件夹,将会⽣成⼀个.vscode⽂件夹,所有的配置将在这个⽂件夹中进⾏配置。

2.配置IntelliSense扩展程序会根据当前系统环境配置基本信息,因此有可能配置不完整,这时需要通过⽣成c_cpp_properties.json⽂件来配置缺少的信息:ctrl+shift+P打开Command Palette,运⾏C/Cpp: Edit configurations...⽣成c_cpp_properties.json:{"configurations": [{"name": "Linux","includePath": ["${workspaceFolder}/**"],"defines": [],"compilerPath": "/usr/bin/gcc", //编译器路径"cStandard": "c11","cppStandard": "c++17","intelliSenseMode": "clang-x64"}],"version": 4}12345678910111213141516这是Ubuntu平台上默认⽣成的c_cpp_properties.json⽂件,可在这个⽂件中添加配置。

对于Windows环境下,需要⾃⼰下载编译器安装并配置,⽐如我下载了MinGW64,然后需要配置环境变量:变量名:MINGW变量值:D:\worksoftware\mingw-w64\i686-8.1.0-posix-dwarf-rt_v6-rev0\mingw32\bin引⼊到Path环境变量中:%MINGW%1234然后重启VS code,并在c_cpp_properties.json⽂件中添加:"compilerPath": "D:\\worksoftware\\mingw-w64\\i686-8.1.0-posix-dwarf-rt_v6-rev0\\mingw32\\bin\\g++.exe"13.构建应⽤程序如果要构建应⽤程序,则需要⽣成tasks.json⽂件:Ctrl+Shift+P -> Tasks: Configure Tasks… -> Create tasks.json file from templates -> Others.{// See https:///fwlink/?LinkId=733558// for the documentation about the tasks.json format"version": "2.0.0","tasks": [{"label": "build demo1", //任务标签"type": "shell", //类型"command": "g++", //对应的命令:g++ -g demo1.cpp -o demo"args": ["-g","demo1.cpp","-o","demo"],"problemMatcher": [],"group": {"kind": "build","isDefault": true}}]}1234567891011121314151617181920212223⽣成tasks.json后,根据⾃⼰需求修改command、args或其他字段。

C语言中头文件和cpp文件解析

C语言中头文件和cpp文件解析

C语⾔中头⽂件和cpp⽂件解析回到cpp⽂件与头⽂件各写什么内容的话题上:理论上来说cpp⽂件与头⽂件⾥的内容,只要是C语⾔所⽀持的,⽆论写什么都可以的,⽐如你在头⽂件中写函数体实现,任何⼀个cpp⽂件包含此头⽂件就可以将这个函数编译成⽬标⽂件的⼀部分(编译是以cpp⽂件为单位的,如果不在任何cpp⽂件中包含此头⽂件的话,这段代码就形同虚设),你可以在cpp⽂件中进⾏函数声明、变量声明、结构体声明,这也不成问题那为何⼀定要分成头⽂件与cpp⽂件呢?⼜为何⼀般都在头件中进⾏函数、变量声明,宏声明,结构体声明呢?⽽在cpp⽂件中去进⾏变量定义,函数实现呢??原因如下: 1.如果在头⽂件中实现⼀个函数体,那么如果在多个cpp⽂件中引⽤它,⽽且⼜同时编译多个cpp⽂件,将其⽣成的⽬标⽂件连接成⼀个可执⾏⽂件,在每个引⽤此头⽂件的cpp⽂件所⽣成的⽬标⽂件中,都有⼀份这个函数的代码,如果这段函数⼜没有定义成局部函数,那么在连接时,就会发现多个相同的函数,就会报错,函数重复定义。

2.如果在头⽂件中定义全局变量,势必会对此全局变量赋初值,那么在多个引⽤此头⽂件的cpp⽂件中同样存在相同变量名的拷贝,关键是此变量被赋了初值,所以编译器就会将此变量放⼊DATA段,最终在连接阶段,会在DATA段中存在多个相同的变量,它⽆法将这些变量统⼀成⼀个变量,统⼀变量的意思也就是仅为此变量分配⼀个空间,⽽不是多份空间。

但是对于声明⼀个变量,这个变量在头⽂件没有赋初值,编译器就会将之放⼊BSS段,连接器会对BSS段的多个同名变量仅分配⼀个存储空间。

3.如果在cpp⽂件中声明宏、结构体、函数等,那么我要在另⼀个cpp⽂件中引⽤相应的宏、结构体、函数,就必须再做⼀次重复的⼯作(意思是说如果不去#include),如果我改了⼀个cpp⽂件中的⼀个声明,那么⼜忘了改其它cpp⽂件中的声明,这不就出了⼤问题了,程序的逻辑就变成了你不可想象的了,如果把这些公共的东东放在⼀个头⽂件中,想⽤它的cpp⽂件就只需要引⽤⼀个就OK了这样岂不⽅便,要改某个声明的时候,只需要动⼀下头⽂件就⾏了。

C++程序格式标准

C++程序格式标准

1.类名命名:以大写C开头,类名必须是有意义的英文字母(与其作用相对应),如果有多个英文字母,则每个英文字母的开头字母要大写。

若类名太长,可以使用英文字母的缩写。

不要使用汉语拼音或单个字母命名。

如果是对对话框类命名,保证必须以Dialog 结尾。

例如:CSetAlarmDialog(用于设置报警参数对话框类的名字)2.函数名命名:以大写字母开头,函数名必须是有意义的英文字母(与其作用相对应),如果有多个英文字母,则每个英文字母的开头字母要大写。

若函数名太长,可以使用英文字母的缩写。

不要使用汉语拼音。

例如:InitialCommand()(用于初始化控制设备的命令)3.变量命名:(1)变量命名总则:变量名=属性+ 类型+ 对象描述+ 自定义。

每个变量定义尽量在函数、过程的开始处就进行定义,尽量避免在代码中不规则的穿插定义。

g_szDemo.(2)类的成员变量:以“m_”开头,变量名必须是有意义的英文字母(与其作用相对应),如果有多个英文字母,则每个英文字母的开头字母要大写。

若变量名太长,可以使用英文字母的缩写。

不要使用汉语拼音或单个字母命名。

例如:m_Command(用于存储设备的相关命令)(3)函数内的局部变量:全部用小写,变量名必须是有意义的英文字母(与其作用相对应),如果有多个英文字母,则英文字母之间使用下划线“_“分开。

若变量名太长,可以使用英文字母的缩写。

不要使用汉语拼音或单个字母命名,尤其是循环控制变量。

例如:command_char(以字符串表示的控制设备的命令)(4)全局变量:以g_开头,变量名必须是有意义的英文字母(与其作用相对应),如果有多个英文字母,则每个英文字母的开头字母要大写。

若变量名太长,可以使用英文字母的缩写。

不要使用汉语拼音或单个字母命名。

例如:g_COMTYPE(串口的种类)(5)函数的形参:全部小写,变量名必须是有意义的英文字母(与其作用相对应),如果有多个英文字母,则英文字母之间使用下划线“_“分开。

c++ 基本格式

c++ 基本格式

c++ 基本格式C++是一种通用的编程语言,它是从C语言中发展出来的,适用于开发各种类型的应用程序,从简单的控制台程序到复杂的图形用户界面和网络应用程序。

在本文中,我们将介绍C++的基本格式和一些相关参考内容。

C++程序的基本格式如下:1. 包含头文件:在程序的开始部分,我们需要包含一些头文件,这些头文件通常包含了C++的标准库或者其他必要的外部库的函数和类。

例如,可以使用#include <iostream>包含iostream 头文件,它包含了输入输出流的相关函数。

2. 命名空间:在C++中,命名空间被用于避免冲突和组织代码。

我们可以使用命名空间来引用特定的函数和类。

例如,可以使用using namespace std;来引用std命名空间中的所有函数和类。

3. 主函数:每个C++程序都必须包含一个主函数,它是程序的入口点。

主函数的格式如下:```cppint main() {// 程序代码return 0;}```4. 变量声明和初始化:在主函数中,我们可以声明和初始化各种变量。

变量是用来存储和操作数据的,它们需要在使用之前进行声明和初始化。

例如:```cppint age; // 声明一个整型变量age = 20; // 初始化变量的值为20float height = 1.75; // 声明并初始化一个浮点型变量```5. 输入和输出:C++提供了各种用于输入和输出的函数。

可以使用cin来读取用户输入的数据,使用cout来输出数据。

例如:```cppint num;cout << "Enter a number: ";cin >> num;cout << "The number is: " << num << endl;```6. 控制结构:C++支持各种控制结构,如条件语句(if-else),循环语句(for、while、do-while)等。

(完整word版)C++代码规范

(完整word版)C++代码规范

C++代码规范目录1.介绍 (1)2.编码规范 (2)2.1文件结构 (2)2.1.1版权和版本的声明 (2)2.1.2头文件的结构 (2)2.1.3定义文件的结构 (3)2.1.4目录结构 (4)2.2结构化程序设计 (4)2.2.1功能模块抽取 (4)2.2.2功能模块编码原则 (5)2.2.3编程标准 (6)2.2.4源代码层次 (6)2.3命名约定 (7)2.3.1综述 (7)2.3.2变量命名 (8)2.3.3函数及数组的命名 (9)2.3.4结构类型命名 (10)2.3.5命名长度 (10)2.3.6Windows应用程序命名规则 (10)2.4程序规则 (12)2.4.1变量声明和定义 (12)2.4.2数组、字符串 (13)2.4.3函数声明和定义 (14)2.4.4语句 (16)2.5排版格式规则 (16)2.5.1源代码文件 (17)2.5.2空行 (17)2.5.3代码行 (17)2.5.4代码行内的空格 (18)2.5.5对齐 (19)2.5.6分行 (20)2.5.7表达式 (20)2.5.8函数 (22)2.5.9语句 (22)2.5.10变量、类型声明 (23)2.5.11修饰符的位置 (23)2.5.12类的版式 (24)2.6注释格式 (24)2.6.1介绍 (24)2.6.2注释基本规则 (25)2.6.3程序注释 (25)2.6.4模块注释 (26)2.6.5函数注释 (27)3.代码管理........................................................................................................ 错误!未定义书签。

3.1版本管理 (61)3.2代码更新 (61)本文的宗旨在于规范化源代码的编写,满足系统面向对象要求、可读性要求、正确性与容错性要求和可重用性要求。

c++编译参数详解

c++编译参数详解

C++编译参数是用来控制编译器行为的一组选项,它们可以在编译过程中传递给编译器以定制化编译过程。

以下是一些常用的C++编译参数:
•-c:只进行编译操作,不进行链接操作,将生成的汇编代码输出到目标文件中。

•-o output_file:指定输出文件的名称,默认输出为a.out。

•-g:生成带有调试信息的代码,方便进行调试。

•-O2:开启优化选项,编译器会尝试优化代码以提高运行效率。

•-O0:关闭优化选项,编译器不会对代码进行优化。

•-Wall:显示所有警告信息,有助于发现潜在问题。

•-Werror:将警告视为错误,有助于保证代码质量。

•-std=c++11:指定使用C++11标准进行编译。

这些参数可以在编译命令行中组合使用,例如:
该命令将使用g++编译器将my_program.cpp文件编译为目标文件my_program.o,并开启所有警告和C++11标准。

C++标准库 std

C++标准库 std

c++标准库及命名空间s t d 1、命名空间stdC++标准中引入命名空间的概念,是为了解决不同模块或者函数库中相同标识符冲突的问题。

有了命名空间的概念,标识符就被限制在特定的范围(函数)内,不会引起命名冲突。

最典型的例子就是std命名空间,C++标准库中所有标识符都包含在该命名空间中。

如果确信在程序中引用某个或者某些程序库不会引起命名冲突(即库中的标识符不会在程序中代表其他函数名称),那么可以通过using操作符来简化对程序库中标识符(通常时函数)的使用,例如:usingnamespacestd;那么就可以不用在标识符在前缀std::来使用C+ +标准库库中的函数了。

<iostream>和<iostream.h>是不一样,前者没有后缀,实际上,在你的编译器include文件夹里面可以看到,二者是两个文件,打开文件就会发现,里面的代码是不一样的。

后缀为.h的头文件c++标准已经明确提出不支持了,早些的实现将标准库功能定义在全局空间里,声明在带.h后缀的头文件里,c++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h。

因此,当使用<iostream.h>时,相当于在c中调用库函数,使用的是全局命名空间,也就是早期的c++实现;当使用<iostream>的时候,该头文件没有定义全局命名空间,必须使用namespacestd;这样才能正确使用cout。

、C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。

由于namespace的概念,使用C++标准程序库的任何标识符时,可以有三种选择:1、直接指定标识符。

例如std::ostream而不是ostream。

完整语句如下:std::cout<<std::hex<<3.4<<std::endl;2、使用using关键字。

usingstd::cout;usingstd::endl;以上程序可以写成cout<<std::hex<<3.4<<endl;3、最方便的就是使用usingnamespacestd;例如:#include<iostream>#include<sstream>#include<string>usingnamespacestd;这样命名空间std内定义的所有标识符都有效(曝光)。

VisualStudioCode配置CC++环境

VisualStudioCode配置CC++环境

VisualStudioCode配置CC++环境前⾔本⽂主要在作者:谭九⿍()的⽂章上进⾏抄袭,对⼀些步骤进⾏简化对初学者更友好。

如果你已经拥有⼀些命令⾏、程序编译和调试,以及使⽤VS Code的知识,请移步到原⽂获得更加详细的介绍。

VS Code 是微软发布⼀款跨平台的源代码编辑器,其拥有强⼤的功能和丰富的扩展,使之能适合编写许多语⾔。

本⽂⾯向初学者(但不是纯⼩⽩),分享⼀点我配置 C/C++ 的经验。

本⽂所有内容均可从VS Code的官⽅⽂档:以及各个扩展的⽂档中获得,并且他们还会进⾏更新。

我的环境:Windows 10 x64、macOS 10.15。

VS Code的配置⽂件在Linux下应该也是通⽤的,但需要修改路径等部位配置。

环境的准备VS Code 的官⽹和下载、安装最新的版本。

VS Code只是⼀个编辑器,并不是IDE(集成开发环境)。

不含编译器(和许多其它功能),所以编译器要⾃⼰安装好。

如果想⽤其他⼯具链或单纯⽤官⽅扩展。

然后下载安装 MinGW-w64,其实 MinGW 和 MinGW-w64 只是名字像,它们是两个不同的项⽬。

为了⽅便,本⽂中的 MinGW 指的其实都是 MinGW-w64。

MinGW 本⾝已经很久没有更新了,故不推荐。

下载以下两个程序(都要):在此页⾯下载 Clang。

选 Pre-Built Binaries 中的 Clang for Windows (64-bit),不需要下.sig⽂件往下翻,在版本选择中选最新版本中的 x86_64-posix-seh由于⽂件在外⽹,部分同学下载太慢,故提供 Win64 版本⽅便下载:: 密码: g5h5本⽂提供两种解决⽅案gcc 精简版下载安装 gcc 和 C/C++ 扩展,添加 gcc 环境变量,打开⽂件夹,新建 helloworld 源代码并保存,按 F1,输⼊build and debug active file。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

关于C++的程序书写规范刘振飞liuzf@PKU-748-RIP 1997.08.31/ *** 版权所有(C) 1997-2004刘振飞liuzf@** 这一程序是自由软件,你可以遵照自由软件基金会出版的GNU通用公共许可证条款来修* 改和重新发布这一程序。

或者用许可证的第二版,或者(根据你的选择)用任何更新的* 版本。

** 发布这一程序的目的是希望它有用,但没有任何担保。

甚至没有适合特定目的的隐含的* 担保。

更详细的情况请参阅GNU通用公共许可证。

** 你应该已经和程序一起收到一份GNU通用公共许可证的副本。

如果还没有,写信给:* The Free Software Foundation,Inc.,* 675 Mass Ave,* Cambridge,MAO2139,USA* 还应加上如何和你保持联系的信息。

**/一.题外话1.关于面向对象(OO:Object-Oriented)的方法OO方法是在结构化程序设计的基础上,进一步力图用更自然的方法来反映客观世界。

数据是用来描述客观具体事物的,而处理的过程实质上是反映了客观事物的运动和相互作用。

OO方法的目标就在于是软件开发的思维更加符合客观世界的思维。

OO的世界观:世界万物都处于不停的运动和发展中,数据和处理不可分割。

OO的方法论:用问题域的模型来模拟客观世界。

在OO的软件系统中,将数据结构和对数据的操作封装在一起,用对象(Object)这一概念来反映客观事物的静态特性(Attribute)和动态特性(Service)。

OO系统是由对象,对象的状态变化及对象间相互作用构成的。

从“面向对象编程(OOP:Object-Oriented Programming)”到“面向对象的设计(OOD:Object-Oriented Design)”,再到“面向对象的分析(OOA:Object-Oriented Analysis)”,OO方法是计算机科学的一次革命。

2.如何评价一个软件的优劣最根本也是最重要的一条应该是软件的“稳定可靠”性,用户或许可以容忍你写的软件功能稍弱,外表不甚美观,但绝不会容忍程序动不动就死机!在你时刻关注着“稳定可靠”性之外,还应考虑以下几方面:从产品角度从开发角度功能齐备满足用户的功能需求实现用户的所有功能易学易用用户稍加培训就可操作,并可以自己进一步摸索方便的联机帮助充分利用面向对象的思想软件的文档齐全界面漂亮 1.美观2.亲切1.充分利用开发环境提供的能力2.书写风格要统一化一个好的软件应该是这样的:它有着经过周密计划和审慎设计的完美的内部结构,同时又具有让人赏心悦目的精美的外观。

这样的软件,你可以称它是一件美妙的工艺品,也可以称它是一部复杂而可靠的机器。

编写好的软件肯定离不了好的书写习惯,它有三方面的含义:(1).安全: 你的代码完成所需的功能之余,不要产生负作用(要稳定可靠!)(2).易读: 类、实例、成员变量、成员函数的命名最好让同事一目了然(3).美观: 让同事看你的程序风格跟看自己的一样;统一就是美以下的讨论都是基于这三条的。

二.养成良好的编程习惯1.禁止使用全局性的变量和函数的(当然CWinApp派生类的那个全局对象除外)在面向对象的系统中,应该是所有的一切都是基于对象的。

你原来习惯的全局函数完全可以放在一个类中,大不了作为一个静态成员函数。

2.局部变量一定要初始化如果你声明一个变量,千万不要以为编译器会自动将之赋零值!你随手给它赋个初值并不麻烦,却会使程序更可靠,何乐而不为呢?int iTemp = 0;CRect rectTemp = CRect(0, 0, 0, 0);3.成员函数的功能一定要单一;实现其功能时不要过分追求技巧,函数体也不能过长功能单一才有利于公用。

计算机是个笨蛋,老老实实的写法可能更适合它,也让别人易懂。

你愿意看PageDown半天都找不着结尾的函数吗?把函数体的长度限制在200行之内吧!交换两个整数i和j的值,方法二是不是比方法一(少用了一个变量)更简单易懂:方法一:i = i+j;j = i-j;i = i-j;方法二:int k = i;i = j;j = k;4.自己定义的类(和界面有关或存储有关,或较为复杂的)尽可能从MFC的最基本类CObject派生出来,但一些基本的类应尽量简单,例如类似于CRect, CPoint之类的类。

利用MFC的CObject作为基类的好处是可以方便的利用它提供的成员函数,比如判断运行时刻类IsKindOf(...)之类的函数。

当然如果你定义的类非常简单,就没有这个必要了。

5.尽可能的将自己定义的类的声明和定义分别放在同一个模块的头文件和实现文件中,象对话框由这种VC++自己生成的框架更是如此假定你定义了一个用于寻找匹配文件的类CFindMatchedFile,那么在该类的声明和inline函数的定义放在头文件FindMatchedFile.h中,在FindMatchedFile.CPP中存放CFindMatchedFile的除inline 函数之外的成员函数定义。

这样可以增加各个类之间的独立性6.除了循环变量i,j,k...之外,文件、类、(成员)变量、(成员)函数的命名要有意义,大小写相间,一目了然;宏定义和常量全要用大写操作系统和编译器既然允许长的名字,我们干嘛还客气?7.设计你的类时要尽量考虑到它的通用性日积月累,你就会拥有自己的类库!8.对自己定义的复杂类一定提供构造和析构函数,在构造函数中初始化所有的成员变量,在析构函数中删除可能申请的内存空间不要让你的构造和析构函数空闲着,也不要让它们再干其余的额外工作9.析构函数前一律加上virtual;所有虚函数前一律加上virtual尽管virtual属性具有继承性,但显式的写上更明了。

析构函数为virtual可以防止”memory leak”。

下面的CSonClass是从CParentClass派生出来的:CParentClass* pParentClass = new CSonClass;...delete pParentClass;如果CSonClass的析构函数是virtual的,那么一切正常;否则最后一句话仅仅释放了ParentClass 占用的空间,并没有释放CSonClass占用的空间10.不需要修改类的成员变量的成员函数,将之声明为const如此可以保证不出现不必要的修改。

比如:DWORD CBirthDay::GetBirthYear() const{return m_dwYear;}11.输入参数声明为const,如果成员函数不会修改该输入参数的内容的话;当需要输入参数是一个类的实例时,请使用引用,或者指针,但严禁直接传送实例,那样不仅效率低,而且易出错,不会带来任何好处用类的实例作为输入参数将大大降低系统的效率,用引用是最好的方法:CBirthDay::CBirthDay(cosnt CBirthDay& BirthDay){m_dwYear = BirthDay.m_dwYear;m_dwMonth = BirthDay.m_dwMonth;m_dwDay = BirthDay.m_dwDay;}12.自己申请的内存Buffer释放后,将其指针置为NULL使用指针之前先判断其有效性,用完就释放之:DWORD* pdwMyBuffer = new DWORD[100];if (pdwMyBuffer != NULL){// 干你的工作...delete []pdwMyBuffer;pdwMyBuffer = NULL;}13.对浮点数比较大小时不要使用==本来应该相等的两个浮点数由于计算机内部表示的原因可能略有微小的误差,这时用==就会认为它们不等。

应该使用两个浮点数之间的差异的绝对值小于某个可以接受的值来判断判断它们是否相等,比如用if (fabs(fOldWidth-fNewWidth) < 0.000001)来代替if (fOldWidth == fNewWith)14.对数组和缓冲区进行检查,防止越界,尤其是变长的情况下你申请多少空间,就只能用多少。

越界使用往往是造成程序无故突然退出的祸首。

15.可以使用ASSERT来提前发现你程序中潜在的错误if语句是说可能存在不同的情况;而ASSERT语句是说肯定存在的情况,如果ASSERT失败,就说明在此之前已经发生了错误。

ASSERT用在自己负责的模块内部很有用,可以提前发现一些不应发生的错误,提高程序的执行效率。

16.特别谨慎使用goto语句,最好别用它尽管goto语句在某些特殊的情况下(比如编译器中)还很管用, 但它破坏了整个程序的结构,尤其使用goto嵌套时,更让人一头雾水(很久以前就有人提出取消它)。

所以不到万不得已时刻不要用它,可以用break,continue之类的语句替代之。

17.所有成员函数尽量是单入口,单出口也许多出口的程序写起来更简洁,意义也更明了。

但出了问题调试时会很难定位,所以宁可多用一些BOOL变量,多加些判断,保证单出口:BOOL CMyClass::DoSomething(PVOID pvBuffer, ...){if (pvBuffer == NULL)return FALSE;...return TRUE;}可以这样写:BOOL CMyClass::DoSomething(PVOID pvBuffer, ...){BOOL bRet = FALSE;if (pvBuffer != NULL){...bRet = TRUE;}...return bRet;}18.调用函数时要严格按照接口规范严格按照函数的输入要求给它合适的参数19.实现(成员)函数时务必要求输入参数是在要求范围之内尤其你定义的(成员)函数给别人调用时,用if语句要比ASSERT更合适20.调用函数后务必要判断其返回值的合法性,如果它的返回值不是void的话不要假定函数调用永远是成功的,异常情况总会发生的,尽管可能性不大21.在你劳神的地方请加上详细的注释说明。

除了最简单的存取成员变量的Set_/Get_成员函数之外,其余大部分的函数写上注释是良好的习惯。

尽量使你的程序让别人很容易看懂太多的注释会使程序很难看,但一些复杂的算法和数据结构处还是要加上注释的,这样别人就容易看懂。

否则时间长了,你自己都未必看明白了22.自己做代码内部(单元)测试时,必须做到语句覆盖,并且特别要注意边界值的覆盖要让每个语句都被执行过,并且边界值(最大和最小)也被测试过。

你在程序中写的各种情况都可能在用户那里出现23.代码写完后要尽可能多的做一些静态检查(Debug调试可是很费神费时的)。

相关文档
最新文档