ADAMS在机械设计中的应用
ADAMS在机械设计中的应用,清晰完整版分享一下,感谢支持前言为什么要写这本书呢?主要出于以下几个原因。第一个原因,是笔者在近十年给机械学院的研究生上“虚拟样机技术及其应用”这门课程的过程中,一直没有找到自己想要的教材。“虚拟样机技术及其应用”这门课,就其传统意义而言,就是谈 Adams应用的。但是 Adams在许多学科中都有应用,那么在选择教材的内容时,应该选择哪些方面的应用呢?是谈机械振动方面的应用,还是刚柔耦合方面的应用?是汽车设计方面的应用,还是试验设计方面的应用?当然这些知识都是有用的,但是对于学生而言,他们是否会觉得谈这种应用很突然呢?就教学规律本身而言,它讲究知识的前后衔接,要求能够给学生一个合理的符合逻辑体系的知识架构,而不是突然从天而降一个空中楼阁,让人不可拾级而上。所有机械专业的学生都学习过理论力学、机械原理和机械设计,而 Adams对这三个方面均提供了大量的支持,如果从这三门课程开始接着谈 Adams,他们会觉得熟悉而亲切,也便于迅速了解 Adams。可惜的是,笔者没有发现这样的书籍。所以很早,笔者就想从这三门课程着手,来谈 Adams对于这些学科的支持,从而为机械专业的硏究生们接触 Adams提供一个合适的切入点。第二个原因,来自于笔者给机械学院的本科生上“理论力学”和“机械原理”这两门课程中所遇到的困惑。理论力学这门课,逻辑严密,题目千变万化,很多动力学的问题,即便像笔者这样教学多年的人,初次遇见时仍旧感到束手无策。所以教学这么多年以来,笔者一直致力于寻求通用解法,希望使用这种通用解法,能够求解一切理论力学的问题。2003年笔者读博士时,偶然接触到计算多体动力学理论,此时突然发现,笔者所苦苦寻找的通用解法,实际上就是计算多体动力学所采用的基本方法。而基于这种计算多体动力学理论,已经出现了几款专门的仿真软件, Adams就是其中之一。所以笔者迅速转人到 Adams,并开始利用它来求解理论力学的各种问题,结果发现它异常好用。无论多么复杂的动力学问题,只要正确建模, Adams都可以给出相当精确的答案。这一发现让笔者如获至宝,所以在近几年给学生上理论力学这门课时,已经开始有意地在上课期间向学生推荐这款软件,也开始在机械创新设计这门机械学院的选修课中向本科生们讲解这款软件的人门知识。此外,在笔者教授机械原理这门课的过程中,更深刻地感受到该软件对于“机械原理”的重要性。机械原理主要讲机构的设计与分析,但是如果学生对于机构的动作并无感性认识,那么无论是分析还是设计都感到困难。而使用 Adams,可以迅速地对机构进行建模、仿真,之后就可以浏览动画,从而对于机构有非常直观的感性认识。除了做动画以外, Adams对于凸轮机构的设计也很有用处。鉴于以上原因,笔者以为, Adams软件并不需要等到研究生阶段才对学生介绍,而是应该在本科阶段就引入。第三个原因,来自笔者带学生参加全国机械创新设计比赛中的体会。在连续三届带领学生参加全国机械创新设计比赛的过程中,笔者深切地感受到学生们在做设计时的那种无助与茫然。他们不知道方案设计从哪里开始,如何给出一个可行的方案,也不明白所给出的方案到底有没有用,无法对方案进行正确的评估,甚至连选择电机的功率都觉得很费劲。而当好不容易给出一个方案以后,他们也不明白结构设计该如何进行。他们所设计的轴和齿轮,基本上没有经过严格的力学计算。这并非他们不想进行计算,而是因为一旦机构复杂化后,几乎无法进行力学计算。我们在学习“理论力学”的静力学部分时,较为复杂的问题也只有四五根杆件,而且还只是平面结构。而对于我们设计的机械产品,一条传动链上可能就有十几个构件,而且还是空间结构。如何根据执行端的受力,正确推算出传动链上各个构件的受力,这是一个艰巨的任务。此时,所谓的解题技巧已经完全没有用处,而只能使用通用解法,也就是一个物体列出6个方程。如果传动链上有10个物体,这就需要列出60个方程。即便我们正确地列出了60个方程,那么该如何求解这60个方程呢?难道准备用手工计算吗?这令人望而生畏。这还仅仅是静力学问题,对于动力学问题该如何处理呢?难道对每个物体列出刚体平面运动微分方程后,再追加加速度关系吗?这更令人不寒而栗。因此许多学生放弃了计算这条途径,而只能随便给一个数据。对于所给定的这个数据,他们心中一点底都没有。到产品设计、加工、装配出来以后,一旦进行加载试验,才发现作品千疮百孔,到处都是问题,似乎每个地方都可能会发生断裂或者变形过大,学生们对自己的作品毫无信心。笔者在连续经过三次这样的比赛以后,深感计算的重要性,也深感我们的确需要一些称手的工具来帮助我们计算,而非手工计算。所以,像 Adams这种进行机构力学计算的软件几乎变得必不可少。所以,笔者深感在机械专业的高等教育中引人像 Adams这样的仿真软件,已经不仅仅是种时髦,也不是一种噱头。对于机械设计而言,他们就如同空气对于人类一样的重要。传统的手工计算方法无法求解复杂机构,对于复杂机构,几乎只有借助专业软件这一条道路。如果不使用专业软件,我们在大学所学习的许多课程,在实践中将会显得毫无用处。笔者以为,这也是为什么我们所培养的学生,在工作过程中觉得大学课程没有用处的一个重要原因。许多课程,对于所研究的对象做了大幅简化,为了能够给岀解析解,使学生可以做课后作业、进行考试,这些课程只能做一些简单的习题。但是实际问题是复杂的、变化万千的,教材所给出的方法很难在实践中得到应用,这就导致了理论与实践的严重脱节,导致了“读书无用论”的泛滥。鉴于此,笔者感到很有必要写一本关于 Adams的书。在这本书中,谈论如何用它对机械专业基础课程中的问题进行求解,使学生在本科或者研究生学习阶段,就能领会这种方法,从而在日后的工作中,能够有意识地使用专业软件来辅助自己的设计,使自己所学习的知识没有白费,这就是笔者写这本书的主要原因。鉴于以上原因,笔者在本书中主要谈了 Adams在理论力学、机械原理和机械设计这三门课程中的应用。在谈这些应用的时候,笔者以例题为主线来展开讨论,这些例题,绝大部分都来自于上课时使用的教材。这样做的目的,是想告诉学生, Adams就是为解决这种问题服务的。除了谈 Adams在这三门课程中的应用外,为了解决更复杂的问题,笔者也专门开辟出两章,一章谈 Adams对于三维的复杂机构是如何进行仿真的,另一章谈如何进行编程。在机械设计过程中,我们经常需要在三维建模软件中做出装配体,然后导入 Adams中进行动力学分析,以考察结构的受力和运动。笔者发现,许多学生对于这种方式很陌生,在进行模型转换时没有使用正确的方法,结果在把模型导亼 Adams后,发现构件数目众多,给建模和调试带来了相当的困扰。笔者在多年的模型转化过程中,找到了一些经验,希望能够分享这种经验,让学生们或者机械工程师们在遇到这种问题时少走弯路。这就是笔者开辟一章谈Ad-ams对于三维复杂机构进行仿真的原因所在。至于编程那一章,来自于笔者在与许多CAE爱好者交流时他们所提出的困惑。他们发现,有时需要对 adams进行二次开发,但是市面上关于 Adams的书籍,谈 Adams二次开发的不多,有的谈到了,但是并没有给出一道完整的例题。这使得他们必须自己一点点摸索、研究、调试,而在遇到问题以后也没有人讨论,觉得自学起来十分费劲,急需得到有效的指导。此外,笔者也发现,很多CAE爱好者,虽然大学时学习过某种编程语言,但是他们实际上并没有编制过多少实用的程序,所以对于如何编程,本身就很模糊。有鉴于此,笔者专门开辟出一章,以一个折叠机构为例,非常详细地说明了如何用 Adams对之进行编程,并伃细阐释了编程中的几乎所有细节问题,包括变量的定义,编程思路的形成,等等。这是一道十分完整的例题,它来自于笔者带领学生做创新设计比赛时遇到的一个实际问题,笔者希望这种详细的讲解能够让大家进入 Adams编程的大门。因此,这应该是一本密切联系实际的书,它的目的是希望学生在学会书中的知识以后,能够在实际设计中,能在 Adams的帮助下使用自己在大学阶段所学到的专业知识;这是一本充满例题的书:第Ⅰ章就有1道单摆的入门例题,理论力学部分有l道例题,机械原理部分有10道例题,机械设计部分有6道例题,编程部分是1道完整的例题,复杂机构部分有3道例题。希望读者在学习这些例题以后,能够触类旁通,举一反三。这也是一本讲解细致的书,对于所有的例题,我们都做了相当详尽的讲解,包括在建模前的理论分析,建模中的详细说明,以及建模后的讨论与小结,等等。我们这样做的目的,是希望读者不仅仅会操作,而且能深刻理解这种操作的由来,并及时总结经验,从而能够非常清晰地理解知识和软件本身。所以,理论联系实际、大量列举例题、详细说明原理,是本书的三大特色。就总体编排而言,本书分为7章。其中,第3章、第4章和第5章,分别讨论 Adams在理论力学、机械原理和机械设计中的应用,这是本书的核心部分;第6章和第7章,分别谈论 Adams的编程以及它对于复杂机构的仿真,这算是扩展部分;第1章是对于 Adams的入门介绍,它简要地介绍了 Adams的两个核心模块: Adams/View和 Adams/ Post processor的最重要功能及一般使用过程,并以一个单摆为例说明如何使用这两个模块;第2章谈的是 Adams,/View的10种基本使用技术。因为这些技术在后面几章的建模和仿真中使用的频率相当高,为了节省全书篇幅,就在该章中对这些常用技术进行了集中讲解,而到后面几章中用到这些技术时,一带而过,所以这两章是基础。因此,本书是由基础篇(第1,2章)、核心篇(第3,4,5章)和扩展篇(第6,7章)组成的。本书的绝大部分内容由宋少云写作,由尹芳反复修改后最终定稿。在本书的写作过程中,我们得到了许多在校学生以及CAE网友的大力支持,尤其是得到了笔者所带的研究生张凤姣、李小力、侯晶晶、李祖吉、满续文的大力帮助,他们提出了很多建设性的建议和意见,并为本书的校稿付出了很多心血,在此一并感谢。本书中的模型文件,读者可以在国防工业出版社网站(htp:w.ndip.cn)“资源下载”栏目下载。由于时间紧张,本书在撰写过程中难免会有一些错误,读者若有意见和建议,请在百度中搜索“宋博士的博客”(htt://blog.sina.com.cn/doctorsongshaoyun),给我留言。目录2.3.8移动构件………………34第1章绪论2.3.9小结…341.1 Adams软件简介12.4如何建模坐标点……………341.2 Adams/View人门…………2.4.1创建单个的坐标点……341.2.1界面介绍2.4.2创建一批坐标点………351.2.2一般使用方法52.4.3小结……………………361.3 Adams/ Post Processor入门……102.5如何创建转动副和移动副…361.3.1界面介绍……2.5.1创建转动副…361.3.2一般使用方法2.5.2创建移动副371.4实例:单摆…………………142.5.3小结…………………384.1问题描述…142.6如何创建驱动381.4.2理论分析………142.6.1施加常数类型的旋转1.4.3建模……………………14驱动…………………381.4.4仿真………………182.6.2施加函数类型的旋转1.4.5后处理18驱动…381.4.6讨论242.7如何施加力…………422.7.1任务描述………………42第2章使用 Adams/view的十种基本2.7.2操作技术262.8如何使用仿真控制对话框432.1如何建模实体262.9如何创建测量………………452.1.1创建连杆………262.9.1观察结果的四种方法…452.1.2创建凸轮2.9.2测量的种类452.1.3小结2929.3创建对象测量的方法…462.2如何观察模型………302.10如何使用文本框…………482.3如何修改实体312.3.1了解构件的内部表示…31第3章 Adams在理论力学中的应用…512.3.2修改构件的名称……323.1引言…512.3.3修改构件的颜色,,323.2静力学分析………………522.3.4修改构件的可见性………323.2.1简支梁的平衡计算……522.3.5修改构件的透明度333.2.2外伸梁的平衡计算582.3.6激活/休眠构件………333.2.3平面桁架内力的计算…652.3.7删除构件343.2.4空间结构的内力计算…74Ⅶ3.3运动学分析805.2齿轮机构的建模与分析……1863.3.1牛头刨床的运动分析…805.2.1概述………………………1863.3.2凸轮机构的加速度5.2.2斜齿圆柱齿轮机构的建模分析……89与分析…883.3.3纯滚动的建模与仿真…975.2.3直齿锥齿轮机构的建模3.4动力学分析104与分析……………1963.4.1质点系动力学………1045.2.4复合轮系的建模与3.4.2三棱柱的滑动…………111仿真…1993.4.3板上有滚子的动力学5.3链传动的建模与分析205问题…………………1205.3.1概述………………………2053.4.4滑轮组的动力学1275.3.2滚子链传动的运动学建模与仿真207第4章 Adams在机械原理中的5.4带传动的建模与分析213应用1335.4.1概述…………………2134.1引言…………………1335.4.2V带传动的建模与4.2核心机构的建模……………134仿真………2154.2.1四杆机构的建模与5.5滚动轴承的建模与分析225仿真………1345.5.1概述2254.2.2六杆机构的建模与5.5.2滚轴轴承的建模与仿真……………………139仿真2264.2.3小结…………………143第6章 Adams编程入门…………2364.2.4尖底推杆盘形凸轮机构的建模436.1引言……………2364.2.5外啮合圆柱齿轮机构的6.2主要建模命令分析237建模……………1486.2.1任务分析………………2374.2.6齿轮齿条机构的6.2.2主要建模命令237建模……1536.3 Adams/view的逻辑控制语句…2464.3高级建模技术…1576.3.1如何使用循环语句……2464.3.1棘轮机构的建模……1576.3.2如何使用条件语句……2484.3.2槽轮机构的建模……1646.4程序片段的编制……2494.3.3凸轮机构的设计……1676.4.1创建关键点的算法……2494.3.4复杂机构的建模与6.4.2创建连杆的算法………252仿真………………1736.4.3创建滑块的算法…2554.3.5大型模型合并技术……1766.4.4创建转动副的算法……2566.4.5创建移动副的算法……260第5章 Adams在机械设计中的应用6.4.6创建集中力的算法…1846.4.7施加速度驱动的5.1引言…184算法…2616.5创建宏………………2627.2凸轮演示机构的运动学仿真…2756.5.1概述2627.2.1问题描述……………2756.5.2创建折叠机构的宏2627.2.2建模分析………2766.6对话框2647.2.3仿真过程2776.6.1概述2647.3单缸发动机的动力学仿真……2886.6.2创建折叠机构的7.3.1问题描述……………288对话框………………2657.3.2建模分析2896.7定义菜单2707.3.3仿真过程2806.7.1概述…2707.3.4讨论3036.7.2创建折叠机构的7.3.5小结303菜单项…殳计2717.4飞剪机的优化设…………3046.8程序的应用……………………2737.4.1问题描述3047.4.2建模分析305第7章 Adams在机械设计中的综合使用7.4.3仿真过程306275参考文献……3227.1引言…………………………275Ⅸ第1章绪论1.1 Adams软件简介Adams的英文全称是 Automatic Dynamic Analysis of Mechanical System,其对应的中文翻译是“机械系统的自动动力学分析”。从该名称可以看出,该软件用于对机械系统进行动力学分析,而机械系统正是机械专业学生进行设计、分析和制造的对象,所以 Adams主要是为机械类学生服务的一款专业软件。Adams是对机械系统进行动力学分析的,这就意味着它与 AutoCAD,Po/ Engineer,Solid Works等软件的设计目的是不一样的。这些软件的主要目的是为机械设计及机械制造服务的,虽然它们也含有分析功能,但 Adams是专门为动力学分析服务的,其动力学分析功能更全面而强大。所谓动力学分析,是指对于某一个系统,当在它上面加上力和或运动后,经过计算,我们可以得到其上任何一个构件或者某个点的位移、速度、加速度,以及在运动副处(如果有的话)的受力情况。这样,对 Adams而言,它输入的是机械系统,输出的主要是位移,速度,加速度和力四种力学量我们知道,动力学分析是诸如理论力学课程所解决的问题。理论力学中已经花费了大量的篇幅谈论如何用动量定理、动量矩定理、动能定理、达朗贝尔原理以及拉格朗日方程来求解动力学问题,为什么还需要用软件来对动力学问题进行分析呢?实际上,仔细研究理论力学中的问题就可以发现,理论力学所提出的解法看似很完美,但只要机构稍微复杂一点(例如有3~5个构件),手工求解就十分麻烦。而在实际工程中我们面对的构件数目成百上千,手工计算其工作量不可思议。工作量大还只是一个方面,更麻烦的在于有些问题从数学上根本就不可能得到解析解,而只能得到所谓的数值解。在这种情况下,对机械系统进行手工动力学分析就成为一件几乎不可能完成的任务。为了解决这个难题,研究人员提出用计算机求解机械系统的动力学问题,并相应地开发出一些动力学分析软件,比较著名的如 Adams, Recurdyn, Simpack, Nucars, Samcef等。Adams只是其中之一,但也是非常重要的一款,它发展到至今也不过30多年,其创始人是美国的 Michael E. Korybalski1973年, Michael E. Korybalski在美国密西根大学安娜堡分校( University of Michigan,AnArbor)获得机械工程硕士学位后,进入福特汽车公司工作,担任产品工程师。四年后,他与人合作在密执安州安娜堡镇创立了MDI公司( Mechanical Dynamics Inc),到1980年开发出第套3D机构运动分析系统商品化软件,称为 Adams。2002年,MDI公司被 MSC Software公司收购,这样 Adams成为MSC产品线的一个组成部分,更名为MSC. Adams。经过多年的发展,如今 Adams发展成为 Adams2013版,这也是本书所使用的版本。Adams发展至今,其包含的内容已经相当广阔,在其内部包含了很多模块,可以求解的问题也超越了单个学科的范围,而成为一个多学科的仿真软件。下面以 Adams2013为例,对其组成做一个简要介绍。Adams2013中包含一系列模块,按照功能总体上可以分为四类:●基础类。包含4个模块: Adams/view主要用于建模,它是本书中使用最多的一个模块Adams/Solver用于计算,初级用户很少会直接使用它,而是在 Adams/vew中通过一个按钮间接调用该模块; Adams/ Post processor用于进行后处理,本书也会经常使用它; Adams/Insight是专门用于做虚拟试验的一个模块,本书不会涉及它●高级类。包含六个模块: Adams/Controls用于机械一控制系统的联合仿真;Adams/ Durability用于耐久性仿真; Adams/Flex用于创建柔性体; Adams/ Mechatronics用于机电一体化系统的仿真; Adams/Vibration用于振动系统的仿真;Ⅴ iew Flex用于创建柔性体●汽车类。包含七个模块: Adams/Car(汽车模块); Adams/Car Ride(平顺性分析模块);Adams/Car Truck(卡车模块); Adams/(has专业底盘模块); Adams/ riverine(传动系统模块);Adams /SmartDriver(高级驾驶员模块); Adams/ire(轮胎模块)。这些模块主要用于汽车设计中。●机械类。 Adams^. Machinery(机械模块),里面包含了对齿轮机构、带传动、链传动、轴承的建模和仿真,这主要是为通用机械设计而提供的一个模块。本书会专门开辟一章介绍其中的内容。下面将主要介绍 Adams的基础类中的两个模块: Adams/View和 Adams/ PostProcessor,它们是我们在实际仿真中用的最多的两个模块,本书的绝大部分任务都是在这两个模块中解决的。12 Adams/view入门Adams/view是 Adams系列产品的核心模块之一,主要用于机械系统的建模。本节介绍两个内容: Adams /view的界面以及 Adams/View的一般使用方法。1.21界面介绍从 Windows的【启动菜单】→【所有程序】→【 MSC Software】【 Adams2013】→【view】→【 Adams-view】进入 Adams/view的欢迎界面(图1-1)。可以看到,该欢迎界面有三个选项● New model(新模型):用于创建一个新的模型。● Existing Model(现存的模型):用于打开一个现有的模型。Exit(退出):退出 Adams/view。这里选择 New Model创建一个新模型,接着弹出了一个 Create New Model(创建新模型)的对话框(图1-2)。该对话框主要用于确定新模型的最基本属性。① Model namer(模型名)。指定该新模型的名称,请使用英文或者汉语拼音,而不要使用中文字符。② Gravity(重力)。用于指定是否需要考虑重力,以及重力的方向。运动学分析不需要考虑重力;动力学分析一般需要考虑重力;而对于静力学分析,基于问题的性质,会有选择性的考虑是否需要重力。对于该项,也可以在进入 Adams,/vew的主界面后再通过主菜单进行设置。③ Units(单位)。主要用于确定模型的长度、质量、力、时间、角度的单位。对于机械产品而言,长度通常为mm,有时候为m。对于该项,同样也可以在进入 Adams/View的主界面后,通过主菜单进行设置。
- 2020-06-27下载
- 积分:1
华为C++语言编程规范
华为C++语言编程规范,内部资料se语言编程规范内部公开目录0说明前言代码总体原则与语言编程规范的关系规范实施、解释术语定义1常量62初始化和类型转换声明、定义与初始化类型转换3函数12内联函数函数参数函数指针4类...14类的设计构造、赋值和析构继承重载5作用域、模板和C+其他特性..25作用域模板其他6资源分配和释放287异常与错误处理33异常错误处理策略8标准库369程序效率语言特性的性能分级语言的性能优化指导华为机密,未经许可不得扩散第页共页se语言编程规范内部公开0并发4511风格48标小符命名与定义排版注释文件组织12可移植性(兼容性).4913全球化52多语言输入输出单一版本时区夏令时14业界编程规范和书籍55业界编程规编程指南《编程规范条规则、准则与最佳实践》《微软一站式示例代码库》扩展学习材料华为机密,未经许可不得扩散第页共页se语言编程规范内部公开语言编程规范0说明前言随着业务的发展和产品架构的演进,越来越多的传统电信产品使用C++语言,很多新型产品更是把C+作为首选。C艹继承于C,包含C的所有特性,同时又增加了新语言特性,如面向对象、泛型设计等。目前C-+使用现状是:基础技能薄弱,陷入很多误区,不能很好地发挥C++的作用。为了帮助团队合理使用C-+,规避语言陷阱,特制定本规范代码总体原则毘C语言编稈一样,C++编稈遵循通用原则:1、清晰第一。清晰性是易于维护、易于重构的程序必需只备的特征。2、简洁为美。简洁就是易于理解并且易于实现。3、选择合适的风格,与代码原有风格俣持一致。除此之外,C+编程还应该注意以下方面1、正确使用C+面向对象技术使得程序结枃清晰、简单,提高了代码的重用性,但又隐藏了很多內部实现细节,内存模型复杂,不小心会误入陷阱,比如:拷贝构造函数,赋值操作符,析构函数,重载等为了简化代码,改善代码结构,提髙编程效率,一些团队引入新特性和第三方库,如:模板技术、STL、Bost等,由于缺乏足够的理解,使用中屡次发生问题,比如对达代器( Iterator)使用不当导致功能失常,甚至稈序崩溃。所以,必须深入理解C艹+对象布局、內存模型等,了解编译器背后所做的处理,才能在编程中知道如何止确使用2、安全高效跟其他流行的高级语言、脚本语言相比,C艹+运行速度快,天然适合开发核心通信部件,但是这些部件对稳定性的要求非常高,不容许发生异常、失效以及崩溃。C艹-具有直接操作硬件、访问內存的能力提供了指针、地址运算等灵活特性,稈序员可以仟意发挥,增加了出锖的几率。所以在追求速度与灵峾性的冋同时,一定要注意保持程序的健壮性。在増强代码稳定性过桯中,程序员通常采用i-else等防御式编程,使得代码非常臃肿,可适当采用RAIⅠ、智能指针等技术华为机密,未经许可不得扩散第页共页se语言编程规范内部公开与语言编程规范的关系本文在《华为技术有限公司C语言编程规范》(简称C规范)基础上,通过详细阐述如何规避C++语言复杂性,避免C+-的低级错误,确保有效使用C-+语言特性,代码易于维扩。C规范里面相同的内容,夲规范不再重复。例如头文伻、变量、表达式、代码编辑与编译、可测试性安全性、单元测试等章节经过审妉,完全适合C+,本规范不再重复。标识符命名与定义、注祥、排版与柊式等内容也适合C++,仅仅添加了少量的C+特有的规则和建议,合并成风格一章;涵数章节增加了內联函数、函数参数等内容;可移植性増加了64位以及C艹+专冇的薮据转换等內容;质量保证也符合C艹+的需要,将资源分配和释放部分C艹特有的内容编写成单独章节;宏、常量也符合C++,考虑到C++普遍使用 cons t,增加了常属性( const)章节。新増初始化和类型转换,类,作用域、模板与C艹-其他特性,异常与错误处理,并发,全球化等C艹特有的内容本规范和C规范有沖突的地方,以本规范为准。规范实施、解释本规范制定了编写C+语言程序的基本原则、规则和建议。木规范适用于公司内使用C++语言编码的所有软件。本规范自发布之日起生效,对以后新编写的和修改的代码应遵守本规范本规范由软件工稈体系发布和维护。实施屮遇到问题,可以到论坛http://hi3ms.huaweicom/group/1735/threads.htmi上讨论。在某些情况下需要违反本规范给出的规则时,相关团队必须通过一个正式的沇程来评审、决貪规则违反的部分,个体程序员不得违反本规范中的相关规则。术语定义原则:编程时必须坚持的指导思想规则:编程时强制必须遵守的约定。建议:编程时必效加以考虑的约定说明:对此原则/规则/建议进行必要的解释。示例:对此原则/规则/建议从好、不好两个方面给出例子。延伸阅读材料:建议进一步阅读的参考材料。常量不变的值更易于理餡、跟踪和分析,所以应该尽可能地使用常量代替变量,定义值的时侯,应该把 const作为默认的选项规则1.1使用 const常量取代宏华为机密,未经许可不得扩散第页共页se语言编程规范内部公开说明:宏是简单的文本替换,在预处理阶段时完成,运行报错时直接报相应的值;跟踪调试时也是显示值,而不是宏名;宏没有类型检查,不安全;宏没有作用域。示例defi: e MAX MSISDN LEN(20)//不好的例子const int MAX MSISDN LEN=20;/好的例子规则1.2一组相关的整型常量应定义为枚举说明:之所以使用枚举,基于:●枚举比# define或 const int更安全,因为编译器会检查参数值是否是否位于枚举取值范围内,从而避免错误发生。示例//好的例子enum DayofWeek( sunday, monday, tuesday, wednesday, thursday, friday, saturday)ienum Ccloriblack, blue, whiter red, purp_e]BOOL CclorizeCalendar (DayofWeek today, Color todays Color)Coorizeca1 endor(b1ue, sunday);//编译报错,1ue和 Sunday位置错误//不好的例子:const int sunday=0iconst int monday= 1const int b⊥acKconst int blueBOOL CclorizeCalendar (int today, int todays ColorCoorizecalendar(blue, sunday);//不会报错当枚举值需要对应到具体数值时,须在声明时昰示赋值。否则不需要昰式赋值,以避免重复赋值,降低维护(增加、朋除成员)工作量示例好的例子:s协议里定义的设备I值,用于标识设备类型cnum TDcv-cclypcDEV UNKNOWN --l,DEV DSMP 0DEV工SMGDEV WAPPORTAL=2程序内部使用,仅用于分类的情況,不应该进行显式的赋值。示例/好的例子:程序中用来标识会话状态的枚举定义enum TSessionstateSESSION STATE INITISESSTON STATE CTOSEDSESSION STATE WA工TING●应当尽量避免枚举值亘复,如必须重复也要用己定义的枚举来修饰,例如:typed f enumRTCP SR 200,RTCP MIN TYPE RTCP SR//must be lowest known typeRTCP RR华为机密,未经许可不得扩散第页共页se语言编程规范内部公开RTCP SDES= 202RTCP BYE203,RTCP APP204,RTCP RTPFB=205RTCP PSEB =206/RTCP XR207RTCP RSI =208RTCP PUBPCRTS =209RTCP MAX TYPF= RTCP PUB PORTS //must be highest known typertcp type ti规则1.3不相关的常量,即使取值一样,也必须分别定义说明:一个常量只用来表示一个特定功能,即一个常量不能有多种用途。示例:/好的例子:协议和协议B,于机号( (MSISDN)的长度都是20。unsigned const int. A MAX MST SDN LEN0;unsigned const int B MAX MSI SDN LEN 20//或者使用不同的名字空间namespace alibunsigned const int MAX MSISDN LEN=20;namespace blibunsigned const int MAX MSISDN LEN =20建议1.1尽可能使用 const说明:在声明的变量或参数前加上关键字 const用于指明变量值不可被篡改。类成员函数加上 const限定符表明该函数不会修改类成员变量的状态使用 const常见的场景:函数参数:传递引用时,如果函数不会修改传入参数,该形参应声明为 const。成员函数:访问函数(如get函数):不修改任何数据成员的函数:未调用非 cons t函数、未返回数据成员的非 const指针或引用的函数。数据成员:如果数据成员在对象构造之后个再发生变化,可将其定义为 cons t。2初始化和类型转换声明、定义与初始化规则2.1禁止用 memcpy、 memset初始化非POD对象说明:PO全称是“ Plain0 ld Data”,是C++98标准(ISO/IEC14882, first edition,19980901)中引入的一个概念,POD类型主要包括int,char, float, double, enumeration,woid,指针等原始类型及其集合类型,不能使用封装和面对对象特性(如用户定义的构造/赋值/析构函数、基类、虚函数等)。华为机密,未经许可不得扩散第页共页se语言编程规范内部公开由于非P0D类型比如非集合类型的 class对象,可能存在虚函数,内存布局不确定,跟编译器有关,滥用内存拷贝可能会导致严重的问题即使对集合类型的 class,使用直接的内存拷贝和比较,破坏了信息隐蔽和数据保护的作用,也不提倡memcpy、 memset操作示例:×××产品程序异常退出( corc dump)。经过现场环境的模似,程序产生 COREDUMP,其原因是:在初始化函数内使用 memset(this,0,sizeof(*this))进行了类的初始化,将类的虚函数表指针被清空,从而导致使用空指针。解决方案:使用C艹构造函数初始化,不要便用 memset函数初始化类对象建议2.1变量使用时才声明并初始化说明:变量在使用前未赋初值,是常见的低级编程错误。使用前才声明变量并同时初始化,非常方便地避免了此类低级错误。在函数开始位置声明所有变量,后面才使用变量,作用域覆盖整个函数实现,容易导致如下问题:程序难以理解和维护:变量的定义与使用分离变量难以合理初始化:在函数丌始时,经常没有足够的笮息进行变量初始化,往往用某个默认的空值(比如零)来初始化,这遥常是一种浪费,如果变量在被赋于有效值以前使用,还会导致错误。遵循变量作用域最小化原则与魷近声明原则,使得代码更容易阅读,方便了解变量的类型和初始值特别是,应使用初始化的方式替代声明再赋值示例:不好的例子:声明与初始化分离string name;//声明时未初始化:调用缺省构造函数nane=" zhangsan";//再次调用赋值操作符函数;声明与定义在不同的地方,理解相对困难好的例子:声明与初始化一体,理解相对容易string name(" zhangsan");//调用一次构造函数建议2.2避免构造函数做复杂的初始化,可以使用“init”函数说明:正如函数的变量都在函数内部初始化一样,类数据成员最好的初始化场所就是构造函数,数据成员都应该尽量在构造函数中初始化以下情况可以使用init(函数来初始化:需要提供初始化返回信息。数据成员初始化可能抛异常。●数据成员初始化大败会造成该类对象初始化失败,引起不确定状态数据成员初始化依赖this揞针:构造凶数没结束,对象就没有构造出来,构造凶数內不能使用this成员数据成员初始化需要调用虚函数。在构造函数和析构函数中调用虚函数,会导致未定乂的行为示例:数据成员初始化可能拋异常:cl ass CPPRule华为机密,未经许可不得扩散第页共页se语言编程规范内部公开publicCEPRule(): size (0), res (null)i//仅进行值初始化long init (int size)//根据传入的参数初始化size,分配资源resr vateint siResourceptrx res//使用方法CPPRule ait(100)建议2.3初始化列表要严格按照成员声明顺序来初始化它们说明:编译器会按照数据成员在类定义中声明的顺序进行初始化,而不是按照初始化列表中的顺序,如果打乱初始化列表的顺序实际上不起作用,但会造成阅读和理解上的混淆;特别是成员变量之间存在依赖关系时可能导致BUG示例://不好的例子:初始化顺序与声明顺序不一致class Emp-oyeepublic:Employee(const charx firstName, const charx lastNamefirstName (firstName), lastName (lastName)r email (firstName.+-astName t huawei. com)ipr-vate:string email, firstName lastName类定义emai1是在 firstName, lastName之前声明,它将首先初始化,但使用了未初始化的ratNam和 lastName,导致错误。在成员声明时,应按照成员相互依赖关系按顺序声明。建议2.4明确有外部依赖关系的全局与静态对象的初始化顺序说明:如果全尻对象A的成员变量有外部依赖,比如依赖另外一个全局变量B,在A的构造函数中访问B,隐含的规则就是B先于A初始化,然而全局与静态对象的初始化与析构顺序未有严格定义,无法确保B已经完成初始化,而每次生成可执行程序都可能发生变化,这类BUG难以定位。通常采用单件( Singleton)模式或者把有依赖关系的全局对象放在一个文件中定义来明确初始化顺序冋一个文件屮,若全局对象a在全局对象b之前定义,则a一定会在b之前初始化;但是不同文件中的全局对象就没有固定的初始化顺序。可以在main0或 pthread once(内初始化一个运行期间不回收的指针类型转换避免使用类型分支来定制行为:类型分支来定制行为容易出错,是企图用C+编写C代码的明显标志。这是一种很不灵活的技术,要添加新类型时,如果忘记修改所有分支,编译器也不会告知。使用模板和虚函数,让类型自己而不是调用它们的代码来决定行为。华为机密,未经许可不得扩散第页共页
- 2020-12-12下载
- 积分:1