总的规则:
. . .
<... declarator | control statement>
{
<statement>;
},如:
log("data corrupt");
}
1、为了提高便携性,本标准建议统一使用了Unix™尾行约定,只有一个LF
字符(的0x0A)结束的每一行。在DOS / Windows的尾行约定以CR,LF
不推荐字符对符(0x0D,0x0A的)终止每行,因为它会导致编译
在Unix上的问题™般的系统,如Linux™。
2、所有的源代码都只使用小写字母为文件或目录命名。这个限制
促进可移植性,因为它消除了在名称不一致的可能性。 例如,在Unix™样系统可能不正确地包括文件“qevent.h”时,文件名是
实际上是“QEvent.h”。
层次:
在函数名后括号面前有没有空间。一个空格应该在”,“后和在实参前。
Indentation(缩进):
所有的缩进都必须正好4个空格以指示范围。
格式化如下:
<declarator | control statement> {// {之前有一个空格
<statement>;. . .
}
上边的格式应用的地方:
function declarator
structure/class declarator
enumeration
structure/array initializer
control statement (if, while, for, switch, case, do)
enumeration
structure/array initializer
control statement (if, while, for, switch, case, do)
structure/array initializer
control statement (if, while, for, switch, case, do)
control statement (if, while, for, switch, case, do)
若<declarator | control statement>一行写不下,应该按照如下格式:
<declarator | control statement ...>
<... declarator | control statement ...><... declarator | control statement>
{
<statement>;
},如:
if (!decodeData(&s, &dataType,/*,分隔符作为一行的结尾*/
{&format, &version)
&& format != 2 /* expecting only format 2 */
&& version != 1) /* expecting only version 1 */
log("data corrupt");
}
好处是消除疑虑,方便阅读;易于添加移除代码。
注释:
注释的分类,总的分成三类:
模块:1、为主要软件组件拟定的高层注释,比如模块,类和外部的API。-》顶层的意见应该总是在注释的对象之前。2、简单地说,解释执行操作的算法细节的精细粒度的注释。-》代码与注释应易于区分。3、附在注释形式的代码中的引用和注释。-》应在模块的末尾,为了展示下一节模块的布局中。
结构如下:
1、头注释块
2、#include说明
3、公共部分规范
4、包部分的规格
5、当地部分规格
6、注意(note)
1、头注释块
/*****************************************************************************
2、包含头文件* Product: . .* Version: . .* Updated: Dec 17 2004** Copyright (C) 2002-2004 Quantum Leaps. All rights reserved.** <licensing terms> (if any)** <Company contact information>*****************************************************************************/
#include "rtk.h" /* Real-Time Kernel */
#include "qassert.h" /* embedded-systems-friendly assertions */
3、定义公共或者全局的变量应该在模块的顶部出现
/* Public-scope objects ---------------------------------------------------*/
QActive *UI_Mgr; /* pointer to the User Interface Manager active object */
4、公共(全局)变量应遵循所有包范围的变量:
/* Package-scope objects ---------------------------------------------------*/
QEvent const QEP_stdEvt[] = {{ Q_EMPTY_SIG, 0},{ Q_INIT_SIG, 0},{ Q_ENTRY_SIG, 0},{ Q_EXIT_SIG, 0}};
5、包范围变量应遵循由当地(模块范围的)声明和局部变量(模块的范围)。所有本地范围变量应该定义静态的。
/* Local-scope objects -----------------------------------------------------*/
static uint32_t l_svMask; /* Space Vehicle mask indicating allocated SVs */
命名:
命名约定:
1、标识符不应超过31个字符。
2、类型名称(typedef、struct、class)应该以大写字母开头。可选的,类型名称可以用模块标识符作为前缀。如:typedef uint16_t QSignal,classQActive。
3、普通的C函数和C ++类的成员函数开始用小写字母。
4、在C语言编写的类成员函数(见第6章)以类名和一个
下划线为
前缀
,所以每一条规则必须以大写字母开头。 (QActive_start())。 除了
明确区分成员函数,这个规则最大限度地减少连接时间命名冲突的
功能(包括第三方库函数)。
5、全局函数是以模块名和一个下划线为前缀(例如:QF_start())。包范围函数,只有从密切相关的组的源文件,所述包的可见的,被附加后缀以下划线(QF_add_())。
6、普通变量开头用小写字母(foo)。
7、全局变量以模块名和下划线为前缀(QK_readySet)。
8、本地变量(只在一个模块内可见)应该用"l_"开始,比如:l_bitmask。在本地的范围内所有的本地变量应该被static声明。
9、常量(数字宏和枚举)应该处于大写字母下并用下滑线连接每个词或缩写(FOO_BAR)。全局常量应该以模块名或标识符为前缀(Q_USER_SIG)。
10、所有组成标识符的其他部分形成的多个单词应该在字边界用大写字母构成,像:fooBarTar,而不是foo_bar_tar。
11、一般来说,更加广阔的范围内更具描述性的名称应该是。对于一个非常有限的范围内,它
推荐使用单字母标识符。如:
o i, j, k, m, n:
用于像循环计数的整形;
o p, q, r, s, t, u, v, w:用于指针或浮点数。