ImageVerifierCode 换一换
格式:DOCX , 页数:38 ,大小:52.17KB ,
资源ID:10621333      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10621333.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(研发中心产品一部C++编码规范.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

研发中心产品一部C++编码规范.docx

1、研发中心产品一部C+编码规范北京山海经纬信息技术有限公司产品一部C+编码规范更新时间:2009. 07版本:V2.0.0.0发布人:李欣 1. 目标保证程序清晰易读,易于维护,保证产品的可持续性发展养成良好的编程习惯,减少出错的可能性,提升产品质量(代码是一项艺术品,程序员是一个专业人员,一个好的习惯利于人利于己)2. 总体原则代码要简洁、易懂、美观风格要统一、一致3. 编码规范1) 代码的对齐与缩进描述:这是一项美观性方面的要求,但实际上很大程度影响着代码的可读性。具体要求:同一级别代码要垂直对齐不同级别代码要有正确的缩进,缩进应使用Tab键。起始与终止的花括号“”应具有相同的缩进距离,并且

2、均各自处于单独一行,该行不应有其它代码。示例:void CTestDlg:OnButton1() int i=0; if(pDBDriver = NULL) return; if(pDBDriver = NULL) MessageBox(failed); return; try . catch(long errCode) while(pDBDriver-FetchRecord(rec) = S_OK) long id; pDBDriver-GetField_Int32(rec, 0, &id); while(pDBDriver-FetchRecord(rec) = S_OK) if(+coun

3、t GetField_Int32(rec, 0, &id); if(count = 600100) break; for(j=0;j100;j+) pClobj = A + (j % 26); switch(type) case 0: . break; case 1: . break; case 2: . break; typedef enum EnumRWM_Unknown = 0, / unknown EnumRWM_Append, / append record EnumRWM_Update, / update record EnumRWM_Delete, / delete record

4、EnumRecordWriteMode;enum EnumType a = 1, b = 2,;class CLogpublic: virtual void WriteLog(const char *pLine) = 0; virtual void WriteText(const char *pText) = 0;2) 代码中的空行描述:代码中合理的空行同样保证程序的清晰易读。代码简洁不意味着要删除空行,行数的多少与代码是否简洁无关具体要求:在函数体与函数体之间应有空行在一个函数体内部,应有合适的空行,表示函数体功能的实现是分步进行的在头文件中声明函数或者变量时,相互无关的函数或变量声明之间通

5、常应有空行相互关联紧密的语句之间不要有空行,如else if与else if之间不能有空行。一般不应有两个以上连续的空行出现示例:class CEzRuleLength : public CEzRulepublic: CEzRuleLength(); virtual CEzRuleLength();public: virtual EnumEzRuleType GetType(); virtual EnumEzRuleCat GetCategory(); virtual void GetName(char *pName); virtual void Prepare(void *pDBCnn, l

6、ong DBCnn); virtual bool CheckRecord(CEzRecordset *pRecordset, long index); virtual long GetSupportFieldType();private: int m_iMinLength; int m_iMaxLength;EnumEzRuleType CEzRuleLength:GetType() return enum_EzRT_Prop_Length;EnumEzRuleCat CEzRuleLength:GetCategory() return enum_EzRC_Prop; / 开始检查 bool

7、bPass = true; int fc = m_arrFieldIndex.size(); for(int i=0;iGetFieldValue(m_arrFieldIndexi); if(pFV-bIsNull) continue; if(pFV-type & GetSupportFieldType() = 0) char msgMAX_RULE_NAME + 512; sprintf(msg, 规则%s应用的字段类型不正确,无法检查, m_strUserName, m_arrApplyFieldi.c_str(); stException *p = new stException( En

8、umError_Failed, _LINE_, _FILE_, msg, 0); throw p; int length = 0; switch(pFV-type) case EnumFType_Int8: case EnumFType_Int16: case EnumFType_Int32: case EnumFType_Int64: char buf64; if(pFV-type = EnumFType_Int8) itoa(pFV-btValue, buf, 10); else if(pFV-type = EnumFType_Int16) itoa(pFV-sValue, buf, 10

9、); else if(pFV-type = EnumFType_Int32) itoa(pFV-lValue, buf, 10); else _i64toa(pFV-i64Value, buf, 10); int size = strlen(buf); for(int i=0;ipText); break; if(length m_iMaxLength) bPass = false; break; 3) 代码中的换行描述:过长的代码很难阅读,需要适当的换行。一些合理的换行可大大提升代码可读性。具体要求:过长的字符串常量可以换行过长的条件判断语句、函数调用可以换行当一个函数参数很多时,为了清晰注

10、释每个参数含义,也可每个参数单独一行换行的位置在“&”、“|”、“+”、“-”、“*”、“/”,“,”等之后。换行均应缩进。但不要把两个很短的语句放在同一行(如在一行中:min=100; max=0;)。示例: return (EnumFType_Int8 | EnumFType_Int16 | EnumFType_Int32 | EnumFType_Int64 | EnumFType_String); sprintf( pBuf, 警告: %s, 代码: %d, 描述: %s, 出错模块ID: %d, 文件: %s, 行号: %drn, pText, pException-code, pEx

11、ception-desp, pException-ModuleID, fname, pException-linenumber); if(st & EnumProcStatus_NeedInput) != 0 & target.iTargetInputIndex = input) if(status & EnumProcStatus_NeedInput) != 0 | (status & EnumProcStatus_NeedInputRestart) != 0) const char *pStr = The MSDN Library is the essential reference fo

12、r developers, with more than 1.5 gigabytes of technical programming information, sample code,;4) 代码中的空格描述:适当的空格提升代码可读性,因此推荐在代码中使用合理的空格。具体要求:“+”、“-”、“*”、“”、“&”、“&”等运算符两侧推荐使用空格隔开函数调用时各个参数之间推荐使用空格隔开只用一个空格进行隔开示例: if(pFV-type & GetSupportFieldType() = 0) char msgMAX_RULE_NAME + 512; sprintf(msg, 规则%s应用的字

13、段类型不正确,无法检查, m_strUserName, m_arrApplyFieldi.c_str(); stException *p = new stException( EnumError_Failed, _LINE_, _FILE_, msg, 0); throw p; 5) 注释的添加描述:注释描述代码的意图。具体要求:注释用于描述代码的意图,不是用于将代码注释掉,没有用的代码要删除,不存在模棱两可的代码。一个类的注释应在头文件中,类的声明之前进行注释。一个类的成员变量应在头文件中进行注释,一般在成员变量声明的前一行加注释,并且后面应空行。一个类的成员函数一般在cpp文件中进行注释,

14、注释内容包括函数的意图、参数的含义、返回值的含义、是否抛出异常、供谁调用、调用前要求等等。If/else if/case等函数体中局部变量的注释可以直接写在局部变量声明的后面,位于同一行。函数比较复杂时,可以分步骤增加注释,以便处理过程清晰易懂。如果变量的含义可以从名称上很明显获得,可以不加注释;如果返回值含义可以从类型上或者函数名称上很明显获得,可以不加注释;当使用一个整型、不同数值代表不同含义时,此时必须增加注释清晰说明。示例:public: / 约束方式 / 0: 第n级代码长度为前面级别定义的所有代码长度之和,默认 / 例如 01, 01002, 010020001, 分别为三个级别的

15、代码 / 1: 第n级代码长度为第n级定义的代码长度 / 例如 01, 002, 0001, 分别为三个级别的代码 long m_iClassType;/ 代码是否已被使用/bool CDlgStdCodeDefine:IsCodeUsed(DBDrv:IDBDriver *pDBDriver, long DBCnn, LPCTSTR lpszCode, long StdID)/ get this format adapter capability, return EnumAdapterCap/long CShpAdapter:GetCap() return ( EnumCap_CanRead

16、 | / 是否支持读取 EnumCap_CanWrite | / 是否支持写入 EnumCap_IsGeoFormat | / 是否可存空间数据 EnumCap_HasProjection | / 是否具有投影信息 EnumCap_CanUpdate | / 是否支持对现有数据更新 EnumCap_HasAttribute | / 是否支持属性 EnumCap_CanIndexRecord | / 支持索引记录 EnumCap_CanUpdateRecord | / 支持更新记录 EnumCap_CanExecuteSQL | / 支持sql查询 EnumCap_CanAppend); if(

17、m_hShape = NULL | m_hDBF = NULL) stException *p = new stException( EnumError_NotOpen, _LINE_, _FILE_, 数据未打开, m_ID); throw p; bHasFilter = false; / do not support sql filter if(m_iRecordIndex = m_iTotalRecordCount) bReachEnd = true; return; bReachEnd = false; CRecord *pRecord = new CRecord(); / get s

18、hape CFieldValue *pShapeField; OGRGeometry *pOGRGeo = SHPReadOGRObject( m_hShape, m_iRecordIndex ); if(pOGRGeo = NULL) / null shape pShapeField = new CFieldValue(0, m_arrSrcFields0.c_str(), (CGeometry *)NULL, false); else OGREnvelope env; pOGRGeo-getEnvelope(&env); if(env.MinX 1E300) OGRGeometryFact

19、ory:destroyGeometry(OGRGeometry *)pOGRGeo); pShapeField = new CFieldValue(0, m_arrSrcFields0.c_str(), (CGeometry *)NULL, false); else CGeometry *pGeo = new CGeometry(pOGRGeo); pShapeField = new CFieldValue(0, m_arrSrcFields0.c_str(), pGeo, false); pRecord-AddFieldValue(pShapeField); / add dbf fields

20、6) 变量的声明和初始化描述:如何定义变量及注意事项。具体要求:在一个类中成员变量的声明要都放在一起(ClassWizard维护的变量例外),一般声明在类的最后,不要和函数穿插着定义。一个类中声明的变量,如其类型为基本类型(如int, double, 指针,bool等)需要在构造函数中初始化,如其类型为class(如CString, 智能指针,Array等)或者struct等,如果有构造函数则一般不需要初始化,总之不让类的变量处在不可知的状态下。在类的析构函数中必须释放指针等对象,一旦定义指针,就要初始化,一旦初始化,就要在析构中加上释放。在一个函数中局部变量尽量在用到的时候再定义,以利于别人

21、理解代码。函数中的局部变量根据情况看是否需要初始化。一个较大类的成员变量应以“m_”开头,一个很简单类或者结构的成员变量可不以“m_”开头,一个函数体内部的局部变量或者函数参数不能以“m_”开头。通常在成员变量名称的选择上,遵守以下规则:Bool类型以m_b开头整型应以m_i开头double以m_d开头float以m_f开头string以m_str开头一层指针以m_p开头两层指针以m_pp开头智能指针以m_p或者m_ptr开头数组以m_arr开头示例:class CPageSelectTable : public CPropertyPage DECLARE_DYNCREATE(CPageSel

22、ectTable)public: CPageSelectTable(); CPageSelectTable(); /AFX_DATA(CPageSelectTable) enum IDD = IDD_DIALOG_SELECT_TABLE ; CListCtrl m_List; BOOL m_bOwner; int m_iViewType; /AFX_DATA /AFX_VIRTUAL(CPageSelectTable) public: virtual BOOL OnSetActive(); virtual BOOL OnWizardFinish(); protected: virtual v

23、oid DoDataExchange(CDataExchange* pDX); /AFX_VIRTUALprotected: void FillList(); /AFX_MSG(CPageSelectTable) virtual BOOL OnInitDialog(); afx_msg void OnCheckOwner(); afx_msg void OnRadioTable(); afx_msg void OnRadioTable2(); afx_msg void OnChangeEditFilter(); afx_msg void OnButtonVer(); afx_msg BOOL

24、OnHelpInfo(HELPINFO* pHelpInfo); /AFX_MSG DECLARE_MESSAGE_MAP()public: bool m_bAllowMultipleSelect; / selected table name CStringArray m_arrSelectTableName; / page1 pointer CPageAdoAdapter *m_pPage1; / sde page pointer CPageSDECnn *m_pPageSDE; / 所选择SDE版本 CString m_strVersion; / 所选图层的LayerIndex long

25、m_iSelLayerIndex;7) 函数的声明及实现描述:定义函数的注意事项。具体要求:在一个类中函数的声明都放在一起(ClassWizard维护的变量例外),一般声明在类的前面,不要和变量穿插着定义。严格来说,大部分函数都应该有返回值,至少表示成功或者失败。函数名称的选择应简明并且清晰,并且单词与单词之间应该有大小写的变化,如FindField、LoadFromXML、SaveToXML、RemoveAllFields等等。函数的功能应尽量简单、明确、不应过长,在编写函数时要考虑其以后的重用性。除了特别简单的函数之外,函数体内应只有一个return语句,并将其放在最后,见下面示例。在我们

26、刚开始写一个程序时,有些功能没有封装为一个函数的必要,但是程序在不断的维护、完善过程中,很可能发现一些重复功能可封装为函数供重复调用,此时需仔细考虑函数的封装、重构等,合适的函数封装可大大提升开发效率并减少出错可能。示例:/ 规则定义/class CEzRule public: CEzRule(); virtual CEzRule(); virtual EnumEzRuleType GetType() = 0; virtual EnumEzRuleCat GetCategory() = 0; virtual void GetName(char *pName) = 0; virtual void

27、 LoadFromXml(IUnknown *pRawElement); virtual void SaveToXml(IUnknown *pRawDoc, IUnknown *ppRawElement); virtual const char* GetUserName(); virtual void SetUserName(const char *pName); virtual void SetParam(CEzRuleParamSet ¶ms); virtual CEzRuleParamSet* GetParam(); virtual long GetCap(); virtual void AddAuxRecord(CRecord *pRecord); virtual bool CheckRecord(CEzRecordset *pRecordset, long index); virtual long GetSupportFieldType(); virtual void Prepare(void *pDBCnn, long DBCnn); void AddApplyField(const char *pFieldName);protected: / 自定义名称 char m_strUserNameMAX_RULE_NAME; / 设置参数 CEzRuleParam

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1