encoding specification编码规范
本文就C语言通用规则进行总结归纳,参考链接也会标注清晰,如若侵权,必删!
“这是一个简短的文档,描述了 Linux 内核的首选编码风格。 编码风格非常个人化,我不会对任何人强加我的见解,但这是我必须要维护的代码(指 Linux 内核代码)的编码风格,对于其他项目代码,我也希望使用它。 写内核代码时请至少考虑本文提出的风格。
首先,我建议打印出 GNU 编码标准,然后不要阅读。 烧掉它们,这是一个很棒的象征性动作。” ——《Linux内核编码风格》
以数规范
- 源文件行数1000行最佳,最多不超过2000行
- 语句长度不超过80个字符,语句间隔最多不超过2行
- 函数名原则上不超过30个字符,超过30个字符的函数占该文件全部函数比例不超过10%
- 函数实现长度不超过25行,局部变量5-10个
- 函数参数个数最好不超过5个
- 全局变量不应长于21个字符;局部变量不应长于10个字符
布局格式
- 文件中不能有超过两行的空行(当然你可以自己安排,统一就行),不同模块间空一行。
- 条件编译宏涉及嵌套或者大跨度的时候,结束宏需要注释信息
- 头文件包含,<x.h>在前,“x.h”在后
- 顺序定义常数宏,定义函数宏,typedef、struct和enums
- 静态数据声明和定义
- 函数,应按它们的逻辑关系而非调用顺序来组织
头文件
- 最好不包含头文件,做到自包含(即单独编译就可以通过)
- 减少头文件包含头文件,避免头文件循环依赖
- 头文件向稳定方向包含,即最好包含不太会变化了的头文件
- 文件内部使用的宏、场景以及静态函数和变量都不能定义到头文件中
/* sys/types.h */
#ifndef _SYS_TYPES_H_ //注意宏定义中包含分路径名(主目录下面不需要)
#define _SYS_TYPES_H_
.../* body of types.h */
#endif /* _SYS_TYPES_H_ */
源文件
#include <stdio.h>
#include "xxxx.h"
#define HELLO_CNT 3
int main(void)
{
int i;
for (i = 0 ; i < HELLO_CNT; i++)
{
printf(“hello world.\n”);
}
return 0;
}
语句
- 避免多层嵌套,嵌套层数不超过2层(卫语句)
- 优先判断异常情况,趁早退出
注释
- 代码最好自表达,但是必要注释也不可少,但也不宜多,需要清晰明了
- 不用//,用/**/;调试注释可以使用#if 0 方便且可以防止嵌套
- 外部API最好注释表明目的和使用方法,方便他人使用
- 条件编译和条件判断跨度大并且嵌套的,分支时需要注释
函数注释
/*
*@ Description:向接收方发送SET请求
* @param req - 指向整个SNMP SET 请求报文.
* @param ind - 需要处理的subrequest 索引.
* @return 成功:SNMP_ERROR_SUCCESS,失败:SNMP_ERROR_COMITFAIL
*/
源文件注释
/*
* Syncookies implementation for the Linux kernel
*
* Copyright (C) 1997 Andi Kleen
* Based on ideas by D.J.Bernstein and Eric Schenk.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*
* $Id: syncookies.c,v 1.18 2002/02/01 22:01:04 davem Exp $
*
* Missing: IPv6 support.
*/