C语言代码规范
#endif //_LIBPAG_H_
1.2 文件内容分段
一个文件中包含多类内容,每类内容作为一段放在一起,每段之前用长串“/////”标明。
例如:一个文件中包含两类接口,捕包接口和过滤接口分别组成一段。
6
/////////////// 捕包接口 ///////////////
///取一个报文 int pag_get();
+ STAT_SIZE_PER_FRAM * sizeof(struct perm);
act_task_table[frame_id * STAT_TASK_CHECK_NUMBER + index].occupied = stat_poi[index].occupied;
◆循环、判断等语句中若有较长的表达式或语句,则要进行适应的划分,长表达式要在低优先级操 作符处划分新行,操作符放在新行之首。
int cnt; ///<cnt 是一个计数用的变量
///判断参数是否全法 if (0 == a || 0 == b || 0 == c) {
return 0; /// 非法则返回 0 }
///数学加,对各个参数进行求和. ///@warning 这样做的算法不是太好 a = a + b + c;
///返回参数和 return a; }
构定义,全局变量,函数。
//////////////////////////////////////// ///@file doxygen_test.h ///文件头是第 1 部分,每个文件必须有,注释采用 doxygen 格式 /// ///@brief 用于详细说明此程序文件完成的主要功能 ///@see 参考内容与其他模块或函数的接口等关系 /// ///修改记录:修改历史记录列表,每条修改记录应包括修改日期、修改者及修改内容。 ///按时间倒序书写,最新的修改在最前面 /// ///@author yuanqb@ ///@date 2012-07-23 /// ///使用 doxygen 注释格式 /// ///@author yuanqb@ ///@date 2012-06-01 /// ///增加实例 ////////////////////////////////////////
{
12
... // program code
}
◆若函数或过程中的参数较长,则要进行适当的划分。 示例: n7stat_str_compare((BYTE *)(&stat_object), (BYTE *)(&(act_task_table[taskno].stat_object)), sizeof(_STAT_OBJECT));
改为: int test_length(int len) {
int var1; char *var2;
if (arg < 0) {
printf("[Error]file.func: argument err! arg = %d\n", arg); }
var1 = 5;
//局部变量初始化
◆代码中关系较为紧密的代码应尽可能相邻,便于理解。 示例:以下代码布局不太合理。
示例: if ((taskno < max_act_task_number)
&& (n7stat_stat_item_valid (stat_item))) {
... // program code }
for (i = 0, j = 0; (i < word[word_index].word_length) && (j < word_length); i++, j++)
曙光信息产业(北京)有限公司 SBB 项目组
C 语言代码规范
文件状态: 文档编号:
[√] 草稿
作 者:
[ ] 正式发布 密 级:
■普通
□秘密
[ ] 正在修改
□机密
□绝密
完成日期:
文档保存状态:
(由配置管理人员填写)
修订历史
版本 0.1.0
修订内容 参考 netfirm 组代码规范创建
完成日期 2012.06.15
(3)"!"、"~"、"++"、"--"、"&"(地址运算符)等单目操作符前后不加空格。
*p = 'a';
// 内容操作"*"与内容之间
flag = !is_empty; // 非操作"!"与内容之间
9
p = &mem; i++;
// 地址操作"&" 与内容之间 // "++","--"与内容之间
return 1; }
应如下书写: if (p == NULL) {
return 0; } else {
return 1; }
11
◆较长的语句(一般>80 字符)要分成多行书写,长表达式要在低优先级操作符处划分新行,操作 符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读。
示例: perm_count_msg.head.len = NO7_TO_STAT_PERM_COUNT_LEN
(4)"->"、"."前后不加空格。
p->id = pid;
// "->"指针前后不加空格
(5) if、for、while、switch 等与后面的括号间应加空格,使 if 等关键字更为突出、明显。 if (a >= b && c > d)
(6)函数名后面不加空格 void get_pkt(int sid);
(7)指针定义符号*的前面加空格。 char *get_string() {
char *str; }
◆不要用 tab 代替空格(一般编辑器中都可以配置不用 tab),以免用不同的编辑器阅读程序时,因 TAB 键所设置的空格数目不同而造成程序布局不整齐。
1.6 换行
◆避免一行有两条语句。
10
示例:如下例子不符合规范。 rect.length = 0; rect.width = 0;
// 如果是头文件,需要避免多次包含 #ifndef _LIBPAG_H_ #define _LIBPAG_H_
4
// 包含文件列表是第 2 部分,可能需要 // 先写标准路径 #include <linux/types.h> //__u64
//再写当前路径 #include "my_header.h"
◆每层缩进 4 个空格,注意不要用 tab 代替 4 个空格。
1.4 空行
◆必须空行的地方包括: A.文件头与文件正文之间;
7
B.每两个函数的实现之间; C.一个函数内部结构相对独立的代码段之间。 D.函数结束之前的 return 之前。
示例:如下例子不符合规范。 int repssn_ind, repssn_ni; if (!valid_ni(ni)) {
5
///@brief 这是函数摘要,测试 doxygen 的测试函数 ///@param a 参数 a 的说明 ///@param b 参数 b 的说明 ///@param c 参数 C 的说明 ///@return 返回值 失败返回 0, 成功返回其他 /// ///@todo 要改进的内容的说明 ///@see 要参考的其他内容的说明 ///@warning 需要注意的内容的说明 int test_function(int a, int b, int c) {
2
审批历史
版本
审批意见
审批日期
审批人
注:本表中只需填写正式发布版本的审批记录,一般由项目经理或者 QA 进行审批。
3
1 排版 1.1 文件
◆头文件要和实现文件分离,头文件要用#ifdefine #define #endif 避免多次包含。
◆文件开头要给出文件的功能、修改历史记录等信息。
◆文件内容的排版顺序为:文件头,包含文件(先写标准路径,再写当前路径),宏定义,数据结
示例:以下代码布局不太工整。 int func(int arg) {
int var1 = 5; //避免声明时赋值 if (arg < 0)
13
{ printf("[Error]file.func: argument err! arg = %d\n", arg);
}
char *var2; //避免中间声明 //some code
n7stat_flash_act_duration(stat_item, frame_id * STAT_TASK_CHECK_NUMBER + index, stat_object);
1.7 函数实现
◆函数内部的代码结构顺序是: A.局部变量声明(如果有局部变量); B.参数合法性检查(如果函数是API接口); C.变量初始化(需要赋初始值的局部变量,都在这一段初始化,不要在声明的同时赋值)。 D.实现代码。
//宏定义列表是第 3 部分 ///@name ioctl 命令 //@{ #define NF_IOC (SIOCDEVPRIVATE + 3) #define NF_IOC_GET_BAR0 0 #define NF_IOC_GET_DRIVER_MEM 1 //@}
///@name 硬件参数 //@{ #define NF_MAX_RX_STREAM_NUM 16 #define NF_NIC_MEM_SIZE (16 << 20) //@}