C编码规范(Ver0.1)

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

可编辑C++编码规范(Ver 0.1) 文档历史

STLPORT 5更新

STLPORT5 支持vc71和vc8 。

新项目建议使用vc8(vc2005)。需要的头文件和LIB放在122/horizon/STLPORT5.0.2/目录下。

StlPort与BoundChecker兼容当BoundChecker与STLPORT一起使用时,会因为stlport使用vector 内存池,以及replacement new,而误报内存泄露等错误。解决方法:

1,当使用BoundChecker时,把系统目录设置成VC自带的stl目录。2,当需要stlport与BoundChecker一起使用时,需要改变STLPORT配置后,重新编译stlport。步骤:

A,修改stlport/stl/_config.h ,在39行左右(最前面)加上”

#define _STLP_DONT_USE_SHORT_STRING_OPTIM 1 ”

B,修改_site_config.h ,在123行左右,“#define _STLP_USE_NEWALLOC 1”和“#define _STLP_USE_MALLOC 1”

这样编译后的版本,无法使用stlport对string的优化,以及自己的malloc和new。意义没有方法1大

STLPORT 使用规范

1,综述

STL PORT 具有对所有容器进行越界检查,遍历器归属,有效性,算法条件检查等各种安全检查。所以H3D工程使用STLPORT作为标准库。

STL PORT 在vc2003/05中,需要使用自己的stream静态链接库。 *.lib 已提供。

2,使用

在vc-tools->options->project->VC++ directories->, 把STL PORT的include , lib目录,分别设置在VC系统include 和 lib目录的前面。

3,配置

需要打开STL PORT DEBUG功能时,在项目属性->C/C++->PreProcessor->Preprocessor Definitions-> 增加_STLP_DEBUG.

跨DLL编程事项

1,不得提供带有stl参数的接口函数

2,不得同时在两个DLL对一个局部HEAP进行操作,例如:在一个DLL 里new的指针,在另外一个DLL内delete

ASSERT定义

使用: assert_custom(bool b){if (b==false) __asm{int 3}; }重新定义assert

内存检测

必须使用memory manager对内存进行检测。严格控制new 以及生命对象周期。书写new的同时,必须先构造好delete的函数。在所有出现new 和delete的地方,加入 memory manager头文件。

STL PORT和MEMORY MANAGER放在 192.168.0.122/share/Horizon

普适原则

1. 直白式的代码比起注释来的更有意义

2. Coders不能为了图方便而牺牲了代码的健壮性和可理解性

3. 格式化规则应当明白直接,花时间考虑如何格式化代码比多花时间编码更有用

4. 规则应该防范那些会引发微妙错误的代码

5. 应该避免无意义的过于烦琐的规则

1. 文件及预处理器

1.1 需要有统一的格式来进行文件头的编写,法律以及更改日志在版本没有稳定前只需留出位置不需要填写内容。具体统一格式下一版中出。

1.2 在头文件中使用#include guards防止被include多次.

(就是#ifndef xxx_hpp #define xxx_hpp #endif)。如何使用guards(#if !defined vs #ifndef)下一版给出。

1.3 Cpp源程序应该最开始#include的头文件必须是其对应的头文件,如果无法编译应该改变其对应的头文件。

1.4 #include一律出现在文件开头, 如果是头文件放在#include guards 之后的开头

1.5 尽量避免头文件依赖,如果某个头文件中需要用到某个类的引用或指针,那么只需要一个forward declaration就足够了。

如:

class Renderer;

Renderer* a;

Renderer& b;

在使用模块时,为了避免过于繁琐的指定所需要的模块中的头文件,可以使用由模块提供的一个功能头文件,这个头文件将包含模块定义的所有头文件。这个头文件由模块编写者提供。

1.6 使用相对#include路径. 目录结构最好和工程的namespace结构类似

推荐

避免定义预处理的宏特别是在头文件中(规则 1.2例外),请使用enum,const,function,template 等避免宏的定义.

如:

用enum {MusicNum = 12} 或 const int MusicNum = 12而不是#define MusicNum 12

用inline max(int a, int b){…}或template max(const A& a, const A& b){…}而不是#define max(a, b) …

2 命名

2.1 类成员变量要使用比较能够明确表意的名字,局部变量名可以简略。类成员变量与局部变量名在命名上要有区别。如(非要求),类成员变量为m_hit_count; 局部变量名hc

2.2具有改变状态的函数, 应当是E文中的动词短语

2.3 在命名中避免trademark,如h3d, kart_

2.4 短名字应当依照通用惯例. 如i j k用于循环控制变量,p q用于指针和遍历子

2.5 预处理宏应尽量避免无法避免的时候,它的命名应当是全大写形式,头文件中使用的宏要么就取一个奇长无比的名字,要么就在使用以后#undef 掉(避免名字污染)

推荐

选择表示目的的名字而不是表示实现的名字,比如定义一个已知设备列表

使用list known_devices;而不是list device_list.

布尔变量和布尔函数应当是E文中的谓词短语这样条件语句读起来就好像是E文中的条件句了. 如if (buffer->is_empty())

描述对象状态的函数应当是名词短语如得到container长度的函数应叫size()而不是get_size()

尽量不使用带有双下划线'__',或是以单下滑线'_'开头的名字

3 空格及空行

3.1 单目前缀运算符不能紧跟有空格如*p,!is_right;单目后缀运算符不能有前导空格如f(),a[],i++;->前后都不能有空格

相关文档
最新文档