<b>1.1. </b><b>程序块要采用缩进风格编写,缩进的空格数</b><b>为</b><b>3</b><b>个</b><b>,缩进与</b><b>对齐</b><b>只使用空格键,不应使用Tab键</b><b>。</b>
说明:由开发工具自动生成的代码缩进格式允许不一致。
<b>1.2. </b><b>函数或过程的开始、结构的定义及循环、判断等语句中的代码都要采用缩进风格,</b><b>case</b><b>语句下的情况处理语句也要遵从语句缩进要求。</b>
<b>1.3. </b><b>在两个以上的关键字、变量、常量进行对等操作时,它们之间的操作符之前、之后或者前后要加空格;进行非对等操作时,如果是关系密切的立即操作符(如-</b><b>></b><b>),后不应加空格。</b>
说明:采用这种松散方式编写代码的目的是使代码更加清晰。
示例:
(1) 逗号、分号只在后面加空格。
int a, b, c;
(2)比较操作符, 赋值操作符"="、 "+=",算术操作符"+"、"%",逻辑操作符"&&"、"&",位域操作符"<<"、"^"等双目操作符的前后加空格。
if (current_time >= MAX_TIME_VALUE)
a = b + c;
a *= 2;
a = b ^ 2;
(3)"!"、"~"、"++"、"--"、"&"(地址运算符)等单目操作符前后不加空格。
*p = 'a'; // 内容操作"*"与内容之间
flag = !isEmpty; // 非操作"!"与内容之间
p = &mem; // 地址操作"&" 与内容之间
i++; // "++","--"与内容之间
(4)"->"、"."前后不加空格。
p->id = pid; // "->"指针前后不加空格
(5) if、for、while、switch等与后面的括号间应加空格,使if等关键字更为突出、明显。
正确写法:
if (a < 0)
{
return;
}
while(a < 0)
a++;
错误写法:
if (a < 0) return;
a++;
<b>1.4. </b><b>一行程序以小于</b><b>80</b><b>字符为宜,不要写得过长。</b>
<b>2.注释</b>
<b>2.1. </b><b>函数头部应进行注释,列出:函数的目的</b><b>/</b><b>功能、输入参数、输出参数、返回值、调用关系(函数、表)等</b><b>。</b>
使用Doxygen的JavaDoc style来注释C++代码,下面是一个典型class的样例。详细可以阅读doxygen_manual-1.6.3.chm。
/**
* A test class. A more elaborate class description.
*/
class Test
public:
/**
* An enum.
* More detailed enum description.
*/
enum TEnum {
TVal1, /**< enum value TVal1. */
TVal2, /**< enum value TVal2. */
TVal3 /**< enum value TVal3. */
}
*enumPtr, /**< enum pointer. Details. */
enumVar; /**< enum variable. Details. */
/**
* A constructor.
* A more elaborate description of the constructor.
*/
Test();
/**
* A destructor.
* A more elaborate description of the destructor.
~Test();
* a normal member taking two arguments and returning an integer value.
* @param a an integer argument.
* @param s a constant character pointer.
* @see Test()
* @see ~Test()
* @see testMeToo()
* @see publicVar()
* @return The test results
int testMe(int a,const char *s);
* A pure virtual member.
* @see testMe()
* @param c1 the first argument.
* @param c2 the second argument.
virtual void testMeToo(char c1,char c2) = 0;
* a public variable.
* Details.
int publicVar;
* a function variable.
int (*handler)(int a,int b);
};
<b> </b>
*
*/
中间的’*’可以省略:
通常的注释需包括的信息
/*************************************************
Function: // 函数名称
Description: // 函数功能、性能等的描述
Calls: // 被本函数调用的函数清单
Called By: // 调用本函数的函数清单
Table Accessed: // 被访问的表(此项仅对于牵扯到数据库操作的程序)
Table Updated: // 被修改的表(此项仅对于牵扯到数据库操作的程序)
Input: // 输入参数说明,包括每个参数的作
// 用、取值说明及参数间关系。
Output: // 对输出参数的说明。
Return: // 函数返回值的说明
Others: // 其它说明
*************************************************/
<b>2.2. </b><b>边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。不再有用的注释要删除。</b>
<b>2.3. </b><b>应尽量避免使用全局变量,如果必须使用全局变量,则</b><b>全局变量要有较详细的注释</b>
<b>2.4. </b><b>如果你需要不归档的注释,在</b><b>Doxygen</b><b>的注释</b><b>/**</b><b>…</b><b>*/</b><b>以外,使用原来的注释即可:如</b><b>://</b><b>…。</b>
<b>3.标识符命名</b>
<b>3.1. </b><b>标识符的命名要清晰、明了,有明确含义,同时使用完整的单词或大家基本可以理解的缩写,避免使人产生误解,</b><b>避免使用单个字符作为变量名(如</b><b>i</b><b>、</b><b>j</b><b>、</b><b>k</b><b>,但</b><b>i</b><b>、</b><b>j</b><b>、</b><b>k</b><b>作局部循环变量是允许的)</b><b>。</b>
说明:较短的单词可通过去掉“元音”形成缩写;较长的单词可取单词的头几个字母形成缩写;一些单词有大家公认的缩写。
示例:如下单词的缩写能够被大家基本认可。
temp 可缩写为 tmp ;
flag 可缩写为 flg ;
statistic 可缩写为 stat ;
increment 可缩写为 inc ;
message 可缩写为 msg ;
<b>3.2. </b><b>基本类型前缀</b>
类型
前缀
例子
int
i
iVertexNum
bool
b
bVisible
long
l
lHandle
byte
byteFlag
char
c
cInputCharacter
unsigned int
ui
uiStartIndex
short
s
sMehtodID
usigned short
us
usIndex
WORD
w
wIndex
DWORD
dw
dwFlags
<b>3.3. </b><b>非基本类型前缀</b>
<b>特殊类型</b>
指针类型
p
pForm
数组类型
a
aNames
静态变量
s_
s_manager(此时如果是成员变量可以忽略非公有属性的下划线前缀规则)
<b>字符串类型前缀</b>
std::string std::wstring
str
strName
char*
pstr
pstrName
char[] 数组
sz
szName
结构类型
class/struct
无前缀
enum
e
ePrimitiveType
在别人的基础上修改而成