C编码规范(Ver0.1)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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
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
布尔变量和布尔函数应当是E文中的谓词短语这样条件语句读起来就好像是E文中的条件句了. 如if (buffer->is_empty())
描述对象状态的函数应当是名词短语如得到container长度的函数应叫size()而不是get_size()
尽量不使用带有双下划线'__',或是以单下滑线'_'开头的名字
3 空格及空行
3.1 单目前缀运算符不能紧跟有空格如*p,!is_right;单目后缀运算符不能有前导空格如f(),a[],i++;->前后都不能有空格