1©UGSCorp.2007.Allrightsreserved.编程规范日期:2007年8月2主要内容¾编码命名规则¾函数的监控¾资源的分配与释放¾其它规范3©UGSCorp.2007.Allrightsreserved.编码命名规则4编码命名规则9文件命名规则规则1-1:用户文件的命名由英文单词组成,采用大小写混排方式,所有单词首字母大写,其余小写。文件名应当采用“动词”或“动词+名词”结构。例如:New.h,CheckPart.cpp。9函数命名规则规则2-1:一般函数的命名与文件命名规则基本相同、采用大小写混排方式,所有单词首字母大写,其余小写。函数名也采用“动词”或“动词十名词”结构。例如:SetPartAttr(),AskNumofRefsets()。5编码命名规则规则2-2:回调函数分为两种:基本回调函数与控件回调函数,它们的命名方式完全相同。回调函数名称由前缀、描述和后缀组成,之间用下划线分隔开来;回调函数的前缀与对话框的前缀相同,全部采用大写字母,用下划线分割单词;描述一般采用大小写混排的方式,如果描述由一个单词组成,也可以采用全小写方式;后缀用cb(callback的缩写)来表示。例如:FILE_NEW_cancel_cb,CHECK_PART_CorrectPart_cb。6编码命名规则-类型9类型命名规则规则3-1:class类型的命名以大写的字母C开头,后面的单词以大小写混排的方式,首字母大写,其余小写。例如:CFileTool,CDlgSelectPart。规则3-2:struct类型的命名以大写的字母S开头,后面的单词以大小写混排的方式,首字母大写,其余小写。例如:SPartAttr,SRefSets。7编码命名规则-类型规则3-3:union类型的命名以大写的字母U开头,后面的单词以大小写混排的方式,首字母大写,其余小写。例如:ULaylerSet。规则3-4:枚举类型(enum)的命名全部采用大写字母,用下划线分隔单词。例如:enumOBJECT_TYPE{point,line,face,body}。规则3-5:用户自定义类型(typedef)的命名全部采用大写字母,用下划线分割单词。例如:typedefchar*POINTER;。8编码命名规则-常量与宏9常量与宏的命名规则规则4-1:常量(const)与宏的命名全部采用大写字母,用下划线分割单词。考虑到系统对宏不进行类型安全检查等不利因素,建议尽量使用常量而不使用宏。例如:下列两个语句的功能是等同的,constintMAX_LENGTH=100;#defineMAX_LENGTH100。9编码命名规则-变量9变量命名规则规则5-1:一般变量的命名规则遵循“匈牙利表示法”。变量名由前缀和描述组成。前缀说明变量的类型,用小写字母表示;描述由英文单词组成,采用大小写混排的方式,首字母大写,其余小写。变量的名称应使用名词或名词词组。需要说明的是,前缀有两种形式,一种由一般前缀构成,如i表示整型,s表示字符串型;另一种由附加前缀与一般前缀组合而成,如ai表示整型数组,ps表示字符串指针。UG中有两种特殊的数据类型:逻辑类型(logical)与对象标识类型(tag_t)。逻辑类型与C语言中的布尔类型基本相同,对象标识类型被定义为无符号整数类型。10编码命名规则-变量一般前缀含义举例i所有整型:int、long、shortintiFileType;f单精度型:floatfloatfDistance;d双精度型:doubledoubledTotalLength;b布尔型:boolboolbIsWorkPart;c字符型:charcharcMark;s字符串型:char[]CharsRefsetsName[MAX_REFSET_LENGTH];l逻辑型:logicallogicallIsDialogOpen;ttag_t数据类型11编码命名规则-变量一般前缀含义举例a附加数组类型intaiSerialNum[10];charasObjName[10][30];p附加指针类型char*psNewString;规则5-2:静态变量的命名采用加前缀s_(表示static)的方式,这样可以方便地区分静态变量与动态变量。例如:statictag_ts_tPrtWortPart=NULL_TAG;。12编码命名规则-变量规则5-4:用户定义的class、struct、union、enum和typedef等数据类型的变量命名方式采用大小写混排,除首个单词的所有单词首字母大写,其余小写。例如:CFileToolfileTool;SPartAttrpartAttr;。规则5-3:全局变量的命名采用加前缀e_(表示extern)的方式,这样可以方便地区分全局变量与局部变量,但建议尽量少用全局变量。例如:externchare_sUGRootDir[_MAX_DIR]。13编码命名规则-变量规则5-5:class、struct和union数据成员的命名在“匈牙利表示法”的基础上加前缀m_(表示member),这样可以方便地区分数据成员与一般变量。例如:structSPartAttr{boolm_bIfRequired;intm_iType;charm_sAttrTitle[50+1];charm_sAttrValue[132+1];}PartAttr;14编码命名规则-变量规则5-6:UG结构类型、联合类型和枚举类型定义的变量均采用所有字母小写、用下划线分隔单词的方式。例如:UF_PART_load_status_terror_status;UF_ASSEM_mc_status_estatus;15编码命名规则–tag_t9tag_t命名规则规则6-1:tag_t的命名规则在“匈牙利表示法”的基础上做了补充,依然采用前缀加描述的方法,只是前缀采用了“t+对象类型简称”的结构。16编码命名规则–tag_t前缀含义举例tPrt文件(Part)tag_ttPrtWorkPart=NULL_TAG;tObj对象(Object)tag_ttObjCircle=NULL_TAG;tExp表达式(Expression)tag_ttExpNewCreated;tFeat特征(Feature)tag_ttFeatToBeDeleted;tBody实体(Body)tag_ttBodyImported17编码命名规则–tag_ttAttr属性(Attribute)tag_ttAttrAssembly;tFont字体(Font)tag_ttFontAdded;tSket草图(Sketch)tag_ttSketHighlight;tRef参考集(RefSets)tag_ttRefFacet;tGroup群组(Group)tag_ttGroupCurves;tDim尺寸(Dimension)tag_ttDimPosition;tView视图(View)tag_ttViewFitForWin;tNote辅助文本(Note)tag_ttNoteCurrent;tFace实体表面(Face)tag_ttFaceBlock;tEdge实体边界(Edge)tag_ttEdgeCylinder;18©UGSCorp.2007.Allrightsreserved.函数的监控19函数的监控大多数的UF函数调用完成后会返回一个整型的错误码。当错误码等于零时表示该函数正常使用,当错误码为非零时表示该函数使用时出错。不同的错误码对应着不同的错误信息,这些对应关系保存在UG系统的数据库中。可以通过函数UF_get_fail_message()将错误码转换为错误信息。在此基础上,UG/OpenAPI提供了UF_CALL宏,当UF函数发生错误时为开发者提供完备的错误信息,包括UF函数所在的文件、所处的行数、UF函数名、错误码和错误描述等。UF_CALL使用十分方便,只需在函数前添加UF_CALL宏即可,例如:UF_CALL(UF_PART_open(sPartPath,&tPart,&tLoadStatus));20函数的监控–UF函数值得注意的是,并不是所有的UF函数都可以使用UF_CALL宏,只有返回值为错误码的UF函数可以使用,即必须满足两个条件:(l)UF函数的返回值是int型。(2)UG/openAPI文档的函数定义中没有特别说明返回值类型。例如下列UF函数不能使用UF_CALL宏:¾extenvoidUF_free(void*data);//函数没有返回值¾extentag_tUF_PART_ask_part_tag(char*part_name);//函数返回值不为int型¾extemintUF_PART_ask_num_parts();//函数虽然返回整型数,但其含义不为错误码21©UGSCorp.2007.Allrightsreserved.资源的分配与释放22资源的分配与释放-C/C++资源内存错误对策内存未分配或分配未成功就使用申请内存后立即检查指针是否为NULL内存分配后未初始化就使用内存在分配后立即初始化使用内存时越界使用内存时关注内存的上界忘记释放内存,造成内存泄露动态内存的申请和释放必须配对释放了内存还继续使用释放内存后立即将指针设置为NULLmalloc/free是C语言的标准库函数,new/delete是c++语言的运算符,它们都可用于申请动态内存和释放内存。23资源的分配与释放-UF资源UF资源的分配与释放是通过一些UF函数实现的。资源分配函数与资源释放函数常常成对出现,不同的资源分配函数往往对应不同的资源释放函数。在UG/OpenDoc中某个函数的参数输入/输出栏中,定义为“outputtobefreed”的参数在使用完后必须释放内存,具体采用哪个释放函数需要参阅文档中的函数说明。函数UF_PART_open()为其参数error_status分配内存空间并赋值,当该参数使用完后需使用释放函数UF_PART_free_load_status()释放内存。24资源的分配与释放-UF资源代码如下:UF_PART_load_status_ttLoadStatus;UF_PART_open(sFilename,tDisplayPart,&tLoadStatus);//分配空间UF_PART_free_load_status(&tLoadStatus);//释放25资源的分配与释放-UF资源(1)通常情况下,一般类型的数组结构变量采用函数UF_free释放内存。例如:tag_t**(tag_p_t*、tag_t*[])、char**、double**和logical**等。(2)结构类型UF_STYLER_item_value_type_t时定义的变量通过函数UF_STYLER_set_value()或UF_STYLE_ask_value()分配空间,由函数UF_STYLER_free_vlue()释放。(3)对象列表结构uf_list_p_t*定义的变量通过函数UF_MODL_create_list()分配空间,由函数UF_MODL_delete_list()释放。26资源的分配与释放-UF资源(4)部件载入状态结构UF_PART_load_status_t定义的变量由UF_PART_open()、UF_ASSEM_add_part_to_assembly()等函数分配空间。由函数UF_PART_free_load_status()释放。27资源的分配与释放-UF资源(5)char***类型的字符串数组变量使用函数UF_free_string_array()释放例如:intiNumOfRefsets;char***default_ref_sets;UF_CALL(UF_ASSEM_ask_default_ref_sets(&iNumOfRefsets,&default_ref_sets));//分配空间UF_free_string_array(&default_ref_sets);//释