联众公司开发部文档《联众公司C++/C代码编写规范》
? 标识符应当直观且可以拼读,可望文知意,不必进行“解码”。
? 标识符最好采用英文单词或其组合,每个单词的第一个字母大写,便于记忆和阅读。尽
量不使用汉语拼音来命名。程序中的英文单词一般不会太复杂,用词应当准确。例如不要把CurrentValue写成NowValue。
? 标识符的长度应当符合“min-length && max-information”原则 ? 命名规则尽量与所采用的操作系统或开发工具的风格保持一致 ? 程序中不要出现仅靠大小写区分的相似的标识符
? 程序中不要出现标识符完全相同的局部变量和全局变量,尽管两者的作用域不同而不会
发生语法错误,但会使人误解
? 变量的名字应当使用“名词”或者“形容词+名词”
? 尽量避免名字中出现数字编号,如Value1,Value2等,除非逻辑上的确需要编号。这是
为了防止程序员偷懒,不肯为命名动脑筋而导致产生无意义的名字(因为用数字编号最省事)
1.2 常量命名
? #define 的常量全用大写字母,单词间用下划线’_’分开
? enum枚举内部的常量用大写字母,建议用枚举定义一组相关的常量,而不用宏定义
1.3 函数命名
? 类的成员函数第一个字母一般都大写
? 全局函数的名字应当使用“动词”或者“动词+名词”(动宾词组)。类的成员函数应当
只使用“动词”,被省略掉的名词就是对象本身。
? 用正确的反义词组命名具有互斥意义的变量或相反动作的函数等。 ? 函数名中不能有‘_’出现,只能是字母和数字组成。
1.4 全局函数命名
? 为了表示某函数是联众自己的给该函数加前缀:
前缀 含义 说明 gc globallink client 只在客户端使用的全局函数 gs globallink server 只在服务器使用的全局函数 gp globallink public 客户端服务器都会用到的函数 说明:不使用gl前缀是因为和OpenGL的函数前缀相同 例如:
gcSetResourceHandle() gcGetScreenWidth() gsWriteExceptionLog() gpDoubleToIni()
— 6 —
联众公司开发部文档《联众公司C++/C代码编写规范》
1.5 结构命名
? 这样定义结构体:
typedef struct tagMYSTRUCT {
...
}MYSTRUCT, *PMYSTRUCT;
不要这样定义: typedef struct{ ...
}MYSTRUCT, *PMYSTRUCT;
2. 文件设计
2.1一个文件中只能有一个类
? 一个文件中最多只能有一个类的代码。
例外1:当两个类或多个类高度内部关联,可以合并到相同的文件
例外2:如果A类和B类关系紧密且B类只在A类中用到且B类的代码不多,可以将B类的代码放到A类的文件中。
2.2一个类至少要有一个头文件和一个执行文件
? 一个类至少要有一个头文件(.h)和一个执行文件(.cpp),如果内联函数很多的情况下还可
以考虑加一个内联文件(.inl),.inl的文件#include 在.h文件的底部
2.3安全include
? 每一个头文件都必须采取措施防止重复包含。
#if !defined(_***_H_) #define _***_H_ ...
#endif // !defined(_***_H_)
2.4最小且完全包含
? 不包含没有关系的头文件,不漏掉应该包含的文件
? 如果在头文件中只用到了类的指针,则指声明该类,而在cpp文件中再#include该
— 7 —
联众公司开发部文档《联众公司C++/C代码编写规范》
类的头文件。 例如:
为了避免重复包含 文件 a.h: class B; Class A {
B *m_pB;
}
文件 b.h class A; class B {
A *m_pA ; }
2.5联众统一的文件头
? 联众所有的代码都要加下面的头信息,并且修改文件时要修改
/******************************************************************\\ 北京联众电脑技术有限责任公司 版权所有 (文件名)
创建: (姓名) (日期) 检查: (姓名) (日期)
说明:(类的功能说明,使用说明)
更改记录------------------------------------------------------------ 修改:(日期) (姓名) (内容:修改或添加的函数或结构名称) 检查:(日期) (姓名) (内容)
\\******************************************************************/
2.6客户端文件命名
? 一般都有三个类View类的文件:GameView、OptionView、ChatView,有些游戏
不需要OptionView
2.7服务器文件命名
? 主要是 ***Game.h、***Game.cpp、GL***Service.h、GL***Service.cpp、
GL***Protocol.h 其中***代表游戏名称。
— 8 —
联众公司开发部文档《联众公司C++/C代码编写规范》
3. 类的设计
3.1 成员的排列顺序
? 类成员的排列顺序public, protected, private ? friend、static成员排在public的前面 ? 成员函数和成员变量分段写,成员函数在前
3.2 在类的定义中不能有inline函数体
? 在类的定义体中不能有内联函数体出现,使用inline声明该函数,在定义的后面或
在.inl文件中实现函数。
例外:空的函数、取值、赋值函数除外: class A {
void SetValue(int iV) { m_iV=iV; } int GetValue(void) { return m_iV; } ~A() { } }
3.3 慎用友元friend
? 应将friend成员的使用减小到最小程度。
3.4 尽量少的public和protected成员变量
? 出于数据保护考虑,应尽量少的public和protected成员变量。
特例:在类的外面使用非常多的变量,且变量不是简单的数据类型,用GetValue()和SetValue()会使程序看起来罗嗦且运行低效的情况除外。
3.5 成员变量要赋初始值
? 所有的成员变量要在构造里赋缺省值
— 9 —
联众公司开发部文档《联众公司C++/C代码编写规范》
3.6 必须有正确的拷贝构造函数和赋值函数
? 为了防止错误的使用编译器生成的缺省的拷贝构造函数和赋值函数,必须编写这两个函
数,如果觉得没有必要写他们可以使用偷懒的方法,将他们声明成私有。例如: class A {
private:
A(const A &a); // 私有的拷贝构造函数 A & operate =(const A &a); // 私有的赋值函数 };
3.7 virtual关键字的使用
? 重载虚函数时为了表明这是一个虚函数必须仍保留使用virtual关键字。 ? 析构函数前必须加virtual关键字
3.8 不允许在类中嵌套定义类
? 不允许在类中嵌套定义类,在类中签套定义类使程序可读性降低
例如: class A {
class B {
... }; ... };
3.9 注释
? 在类的头文件的顶部注释说明类的功能和使用方法
/******************************************************************\\ 北京联众电脑技术有限责任公司 版权所有 (文件名)
创建: (姓名) (日期) 检查: (姓名) (日期)
说明:(类的功能说明,使用说明)
更改记录------------------------------------------------------------ 修改:(日期) (姓名) (内容:修改或添加的函数或结构名称) 检查:(日期) (姓名) (内容)
— 10 —