CC++语言编程规范.docx
- 文档编号:9443861
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:42
- 大小:39.86KB
CC++语言编程规范.docx
《CC++语言编程规范.docx》由会员分享,可在线阅读,更多相关《CC++语言编程规范.docx(42页珍藏版)》请在冰豆网上搜索。
CC++语言编程规范
XXX®
C/C++语言编程规范
文件状态:
[]草稿
[]正在修改
[]正式发布
文件标识:
XXX
当前版本:
作者:
完成日期:
XXX
http:
//www.XXX.com
I.文档控制
1)文档更新记录
日期
更新人
版本
备注
2)文档审核记录
日期
审核人
职务
备注
3)文档发行范围
分发单位
说明
目录
1.引言5
1.1编写目的5
1.2内容5
1.3预期读者5
1.4参考资料5
1.4缩写和术语5
2.命名规则6
3.文件组织8
3.1头文件的结构8
3.2内部包含卫哨8
3.3源文件的结构8
3.4头文件包含顺序9
3.5外部包含卫哨9
3.6目录结构10
3.7其它原则10
4.代码版式11
4.1空行11
4.2代码行11
4.3代码行内的空格12
4.4对齐与缩进12
4.5长行拆分13
4.6修饰符的位置14
4.7注释风格14
5编程规则和建议16
5.1表达式16
5.2声明和定义17
5.3整数数据类型及操作17
5.4字符操作18
5.5浮点型18
5.6常量19
5.7指针19
5.8数组20
5.9函数20
5.10控制语句21
5.11内存使用21
5.12错误处理21
5.13断言21
5.14类22
5.15结构成员对齐方式22
5.16连接规范24
5.17函数调用规范25
5.18通用规则和建议25
6.附件27
6.1头文件样式模板27
6.2源文件样式模板27
6.3函数头注释模版28
1.引言
1.1编写目的
本文档的目的是为XXX公司使用C/C++语言进行软件开发提供编程规范指南。
声明:
(1)本规范针对的C++语言是指ISO/IEC14882:
1998标准规定的C++语言规范。
(2)本规范对编程过程中使用的第三方程序库不做任何假设,第三方程序库仍然保留其固有的编程风格和规范。
规则0:
不存在绝对的编程规范和规则;规范和规则不应有正确与错误之分,只有适合与不适合、好与不好或者通用与不通用的区别。
规范和规则强调的是一致性,这个一致性有三层含义:
①每个开发人员编写的代码要前后一致;②每个项目组采用统一的编程规范;③全公司各项目组都采用统一的编程规范。
1.2内容
编程规范不仅仅包含编程风格,更重要的是指导如何正确运用语言提供的机制,提供常用的惯用法,改善编程效率和程序性能的方法和技巧,以及编程的禁区。
大部分的内容可以用“规则”或“规范”的形式固定下来,但是也有很多内容只能以“建议”的形式呈现。
1.3预期读者
本文档的主要读者包括:
-开发设计人员和程序员
-项目管理员
-软件质量保证人员
1.4参考资料
[1]<
[2]<
[3]<
[4]< 101条规则、准则和最佳实践>> 1.5缩写和术语 标识符(identifier) 指C/C++中的一个变量、常量、宏、函数或类型的名字 定义(define) 提供一个程序元素或实体在程序中的唯一描述 声明(declare) 把一个名字引入一个程序或者一个作用域,以向编译器表明该名字的存在性及其作用域 作用域(scope) 一个名字可以被引用的程序范围。 C++有6种作用域: 全局,文件,程序块,函数体,函数原型,类,名字空间 编译单元 源文件及其递归包含的所有头文件共同编译生成的目标模块(.obj/.o),一个源文件是一个最小的编译单元 2.命名规则 类别 规则 示例 共性规则 -所有标识符的名字应当直观且可以顺利拼读,可望文生义,不必进行解码(即自说明的,几乎不需要专门的注释); -同一个作用域中不要出现仅靠大小写来区分的相似标识符,虽然C/C++是大小写相关的; -在设计中,所有模块(namespace)、函数、变量、宏、类型等的名称均由字母、数字和单下划线组成,尽量少使用数字(除非语义如此),标识符的头部和尾部一般不要使用下划线和数字; -所有的名称均应具有实际含义,应体现实际用途,不应该包含那些不被普遍接受和认同的缩略语; -尽量不要出现局部变量和全局变量同名的现象,虽然两者作用域不同而不会发生语法错误,但是会使人误解并可能引起语义错误; -变量的名字应该使用“名词+名词”或“形容词+名词”的格式来命名; -函数名建议使用“动词”或“动词+名词”的格式来命名,并表明自己的功能; -使用正确的反义词来命名具有相反意义的变量或相反动作的函数等; -标识符的长度应该符合“min-length&max-information”原则; -避免使用过度缩写和简写; currentValue timeToStart timeToStop Time time MAX_LENGTH for_each find_if msgTypeCode oldValue SetTypeCode() Execute() GetTypeCode() minValue/maxValue,start/stop begin/end,first/last,src/target 模块 (C++用namespace来定义模块) -模块名以实际的模块名称的大写缩写字母组成; namespaceAgcf{…} namespace ConfigManagement{…} namespaceSimulator{…} 类/自定义类型 -使用首字母大写的单词组合; -自定义类型避免使用宏和常量的命名规则; MutexLocker 普通变量 和 形式参数 -采用第一个单词首字母小写而后面的单词首字母大写的单词组合; -不建议使用下划线; -避免使用不易分辨和容易混淆的类型前缀符号,特别是单个字母的类型前缀,例如i,b,l,s,f,n等; drawingMode defaultValue pBaseMsgMap dwColor 数据成员 -数据成员使用普通变量命名规则结合Microsoft规则(加前缀m_); -static数据成员遵循普通变量的命名规则并加前缀s_; -const数据成员遵循常量的命名规则,最好使用类内部定义的enum代替; m_drawingMode m_defaultValue staticints_objectCount; 函数名 (包括成员函数) -全部使用首字母大写的单词组合而成; -特别地,在特定的快速开发工具以及使用工具自动生成的代码,具有特定的命名规则,如果这些规则用户不可编辑修改,请遵循这些特定的规则而不必拘泥于本文档的建议; get_name() compare_times() write_to_video_card() GetMaxSpeed() DeleteItem() 宏和常量 -以所有字母全大写的单词和单下划线组成,以下划线作为区分语义各部分的分割符,首尾不使用下划线; -特别地,标志宏可以在头部或尾部加‘_’,常见的标志宏有: 头文件包含卫哨、预编译组态、编译器和操作系统特征定义等; SERVER_PORT_NUMBER TIME_OUT _SUPPORT_NAMESPACE_ _SunCC_ _unix __linux__ 枚举类型常量 -遵循常量的命名规则; enumThreadStatus { THREAD_INIT, THREAD_ACTIVE, THREAD_SUSPENDED, THREAD_DEAD }; 全局变量/对象 -如果不得已使用全局变量,则遵循普通变量的命名规则,同时加前缀g_/gs_ g_oldPosition gs_totalNumber 说明: 具体项目的模块命名、文件命名、类型系统定义等均由相应的项目管理文档定义,并由项目组全体成员共同遵守。 3.文件组织 3.1头文件的结构 【注意】不要在头文件中包含文件作用域级的静态函数的原型声明和实现,以及文件作用域级的静态变量的声明和定义。 3.2内部包含卫哨 内部包含卫哨实际上是一种标志宏,其作用是防止同一个头文件的内容在同一个编译单元中被重复包含,因为如果重复包含了同一个头文件的内容,编译器就会报告重复定义错误。 有了内部包含卫哨,我们就可以在同一个编译单元中多次包含同一个头文件而不会造成重复包含。 例如: //xxx.cpp #include“xxx.h” #include“xxx.h”//Noproblem! 内部包含卫哨应该遵循下列命名规则: (1)基本命名应该与头文件名称一致,首尾下划线可选; 示例: //SwDTV_TIF_data.h #ifndef_SwDTV_TIF_DATA_H_ #define_SwDTV_TIF_DATA_H_ …… #endif//! _SwDTV_TIF_DATA_H_ (2)在基本名称的基础上可以在首尾添加修饰词,例如INCLUDED等; 示例: //SwDTV_TIF_data.h #ifndef_INCLUDED_SwDTV_TIF_DATA_H_ #define_INCLUDED_SwDTV_TIF_DATA_H_ …… #endif//! _INCLUDED_SwDTV_TIF_DATA_H_ or: //SwDTV_TIF_data.h #ifndef_SwDTV_TIF_DATA_H_INCLUDED_ #define_SwDTV_TIF_DATA_H_INCLUDED_ …… #endif//! _SwDTV_TIF_DATA_H_INCLUDED_ 3.3源文件的结构 源文件应遵循以下顺序安排内部结构: 源文件注释(包括文件说明、功能描述、版权声明等)(必须有) 预处理指令(如果需要) 常量和宏定义(如果需要) 外部变量声明和全局变量定义及初始化(如果需要) 成员函数和全局函数的定义(如果需要) 文件修改记录 源文件的样式模板请参考本文档6.2节。 3.4头文件包含顺序 无论是在头文件中还是源文件中,在文件开始部分包含其他的头文件时需要遵循一定的顺序。 如果包含顺序不当,有可能出现包含顺序依赖问题,甚至引起编译时错误。 推荐的顺序如下: 在头文件中: ①首先包含当前工程中所需要的自定义头文件(顺序自定); ②其次包含第三方程序库的头文件; ③最后包含标准头文件; 在源文件中: ①首先包含该源文件对应的头文件(如果存在); ②其次包含当前工程中所需要的自定义头文件; ③然后包含第三方程序库的头文件; ④最后包含标准头文件; 3.5外部包含卫哨 当包含一个头文件的时候,如果能始终如一地使用外部包含卫哨,可以显著地提高编译速度,因为当一个头文件被一个源文件反复包含多次时(常常是因为递归的#include指令展开后所致),可以避免多次查找和打开头文件的操作。 例如: #if! defined(_INCLUDED_P_THREAD_) #include“pthread.h” #define_INCLUDED_P_THREAD_ #endif//! _INCLUDED_P_THREAD_ 建议外部包含卫哨和内部包含卫哨一致起来,这样就可以少定义一个标志宏。 例如: #if! defined(NST_THREAD_H_) #include“Utility/NST_thread.h” #endif//! NST_THREAD_H_ 因为文件NST_thread.h中的内部包含卫哨就是NST_THREAD_H_。 可以仅在头文件中包含其他头文件时使用外部包含卫哨,源文件中可以不使用,也基本不会影响编译速度。 标准头文件的外部包含卫哨如下定义: #if! defined(_INCLUDED_STD_DEQUE_) #include #define_INCLUDED_STD_DEQUE_ #endif//! _INCLUDED_STD_DEQUE_ #if! defined(_INCLUDED_STD_CASSERT_) #include #define_INCLUDED_STD_CASSERT_ #endif//! _INCLUDED_STD_CASSERT_ #if! defined(_INCLUDED_STD_STRING_) #include #define_INCLUDED_STD_STRING_ #endif//! _INCLUDED_STD_STRING_ #if! defined(_INCLUDED_WINDOWS_H_) #include #define_INCLUDED_WINDOWS_H_ #endif//! _INCLUDED_WINDOWS_H_ 标准头文件外部包含卫哨标志宏的定义规则如下: “_INCLUDED_STD_”+“大写头文件名” 如果标准头文件带有.h扩展名,则定义规则如下: “_INCLUDED_STD_”+“大写头文件名”+“_H_” 3.6目录结构 ●建议将头文件和源文件置于不同的目录下存放,这样便于配置管理和维护。 例如可将头文件保存于include目录下,将源文件保存于source目录下,都可以是多级目录; ●其他文件可以遵循MSVC工程的惯例。 3.7其它原则 ●要隔离出依赖于机器硬件和操作系统的代码; ●将软件包和模块的对外接口与其实现分离(接口指函数原型和抽象类等); ●为每一个软件包和模块创建一个入口头文件,它#include为使用该软件包或模块所必须包含的头文件。 4.代码版式 版式虽然不会影响程序的功能,但会影响可读性。 程序的版式追求清晰、美观,是编程风格的重要构成因素。 4.1空行 空行起着分隔程序段落的作用。 空行得体(不过多也不过少)将使程序的布局更加清晰。 建议在需要空行的地方仅使用1~2个空行。 ●建议4.1.1: 在每个类声明之后、每个函数定义结束之后都要加空行。 参见示例4-1(a); ●建议4.1.2: 在一个函数体内,逻揖上密切相关的语句之间不加空行,其它地方应加空行分隔。 参见示例4-1(b); ●加空行的原则: 使得代码块儿看起来松紧有度。 //空行 voidFunction1(…) { … } //空行 voidFunction2(…) { … } //空行 voidFunction3(…) { … } //空行 while(condition) { statement-block1; //空行 if(condition) { statement-block2; } else { statement-block3; } //空行 statement-block4; } 示例4-1(a)函数之间的空行示例4-1(b)函数内部的空行 4.2代码行 ●规则4.2.1: if、for、while、do等语句自占一行,执行语句不得紧跟其后。 示例4-2(a)为风格良好的代码行,示例4-2(b)为风格不良的代码行。 intwidth;//宽度 intheight;//高度 intdepth;//深度 intwidth,height,depth;//宽度高度深度 x=a+b; y=c+d; z=e+f; X=a+b;y=c+d;z=e+f; if(width { dosomething(); } if(width for(initialization;condition;update) { dosomething(); } //空行 other(); for(initialization;condition;update) dosomething(); other(); 示例4-2(a)风格良好的代码行示例4-2(b)不推荐的代码行 ●建议4.2.1: 第一次使用变量的时候定义并初始化该变量(就近原则),或者在一个程序块儿内的变量可以放在该程序块儿开头部位一起定义并初始化(不包括子程序块儿内的变量),这样可以提高函数执行的效率; ●建议4.2.2: 一行代码只做一件事情,如只定义一个变量,或只写一条语句,这样的代码容易阅读,并且便于写注释。 4.3代码行内的空格 ●建议4.3.1: 关键字之后要留空格。 象const、virtual、inline、case等关键字之后至少要留一个空格,否则无法辨析关键字。 象if、for、while、switch等关键字之后应留一个空格再跟左括号‘(’,以突出关键字; ●建议4.3.2: 函数名之后不要留空格,紧跟左括号‘(’,以与关键字区别; ●建议4.3.3: ‘(’‘[’向后紧跟,‘]’、‘,’、‘;’、‘)’向前紧跟,紧跟处不留空格; ●建议4.3.4: ‘,’之后要留空格,如Function(x,y,z)。 如果‘;’不是一行的结束符号,其后要留空格,如for(initializationc;ondition;update); ●建议4.3.5: 赋值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符,如“=”、“+=”、“>=”、“<=”、“+”、“*”、“%”、“&&”、“||”、“<<”、“^”等二元操作符的前后应当加空格; ●建议4.3.6: 一元操作符如“! ”、“~”、“++”、“--”、“-”、“&”(地址运算符)、“*”(反引用)等前后不加空格; ●建议4.3.7: 象“[]”、“.”、“->”、“.*”、“->*”、“: : ”这类操作符前后不加空格; ●建议4.3.8: 象“? ”、“: ”这类操作符前后要加空格; ●建议4.3.9: 对于表达式比较长的for语句和if语句,为了紧凑起见可以适当地去掉一些空格,如for(i=0;i<10;i++)和if((a<=b)&&(c<=d));或者可以在低优先级的运算符处断行; ●建议4.3.10: 在二元和三元操作符周围要有空格; ●加空格的原则: 使得代码行看起来张弛有度,长度适中。 voidFunc(intx,inty,intz);//良好的风格 voidFunc(intx,inty,intz);//不良的风格 if(year>=2000)//良好的风格 if(year>=2000)//不良的风格 if((a>=b)&&(c<=d))//良好的风格 if(a>=b&&c<=d)//不良的风格 for(i=0;i<10;i++)//良好的风格 for(i=0;i<10;i++)//不良的风格 for(i=0;i<10;i++)//过多的空格 x=(a a: b;//良好的风格 x=(a a: b;//不好的风格 int*x=&y;//良好的风格 int*x=&y;//不良的风格 array[5]=0;//不要写成array[5]=0; a.Function();//不要写成a.Function(); b->Function();//不要写成b->Function(); 示例4-3代码行内的空格 4.4对齐与缩进 ●规则4.4.1: 程序块的分界符‘{’和‘}’应独占一行并且位于同一列,同时与引用它们的语句左对齐或者向右缩进4个空格(可以设置编辑器使TAB键自动转换为4个空格); ●规则4.4.2: {}之内的代码块与‘{’左对齐(函数体除外),或者在‘{’右边4个空格处左对齐,不要使用TAB键; ●对齐与缩进风格的原则: 使代码看起来段落和层次分明。 示例4-4(a)为风格良好的对齐,示例4-4(b)为风格不良的对齐。 voidFunction(intx) { …//programcode } voidFunction(intx){ …//programcode } if(condition) { …//programcode } else { …//programcode } if(condition){ …//programcode } else{ …//programcode } for(initialization;condition;update) { …//programcode } for(initialization;condition;update){ …//programcode } While(condition) { …//programcode } while(condition){ …//programcode } 如果出现嵌套的{},则使用缩进对齐,如: { … { … } … } 示例4-4(a)风格良好的对齐与缩进示例4-4(b)风格不良的对齐 4.5长行拆分 ●规则4.5.1: 代码行最大长度控制在一屏之内。 代码行不要过长,否则眼睛看不过来,也不便于打印; ●规则4.5.2: 长表达式要在低优先级操作符处拆分成多行,操作符放在新行之首(以便突出操作符)。 拆分出的新行要进行适当的缩进,使排版整齐,语句可读。 这样的运算符最常见的就是二元运算符和输入输出运算符; ●对于像if、for、while等语句块儿,如果条件表达式需要拆分成多行,为了避免下面的语句块看起来被条件表达式的缩进所架空,可以适当缩进下面的语句块。 if((very_longer_varia
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- CC 语言 编程 规范