1 共同
Rule 1 编译的Warnings不能被忽略掉
Rule 2 在已有Code或者三方的code基础上的改动,同意使用原来的coding standard
Rule 3 假设同意C和C++都訪问的同样的C的header 文件,extern C 必须在header文件中
#ifdef __cplusplus
extern "C" {
#endif
/* body of header */
#ifdef __cplusplus
}
#endif
2 命名规则
Rule4 全部名字的定义在16个字节范围内,最多不要超过31个
Rule5 名字的定义仅仅有字母数字和下划线
Rule6 不要使用保留名字
Rule8 代码的文件格式必须保持UNIX file format
Rule9 文件名称小写,当超过一个单词描写叙述时。用下划线分隔
structured_data_display.h
structured_data_display.c
Rule10 Typedefs,and enumerated types,structure types and union types 小写并用下划线分隔多个单词描写叙述,结尾应以type结尾
typedef UINT8 user_data_struct_type
Rule11 宏定义,Enum的值,必须大写并下面划线分隔多个单词
#define USER_DATA_MAX_ERROR_CODES 15
enum user_data_struct_type
{
USER_DATA_ERROR_INVALID_DATA,USER_DATA_ERROR_FAILURE
};
Rule12 函数名必须是动词而且小写和下划线分隔多个单词
handle_error
check_for_error /* NOT errorCheck */
Rule13 全局变量必须以g开头并下面划线分隔单词
g_default_interface
Rule14 函数的參数小写单词
void start_engine(engine_type* myengine,UINT8 engine_id,const UINT32* protected_data);
Rule15 structure的成员变量有下面规则
名字 | 标记 | 演示样例 |
---|---|---|
static | s_ | static UINT8 s_some_number |
static | s_ | static UINT8 s_some_number |
constant | c_ | const UINT8 c_some_number |
cp_ | const user_data_type* cp_user_data |
3 Files
#ifndef FOO_H
#define FOO_H
/* The rest of the file*/
#endif
Rule17 相对路径的linux文件不同意出如今#include里
// NOT ALLOWED
#include <../foo/include/foo.h>
Rule19 每一个头文件仅仅include 其它有依赖的,包括相关定义的头文件,不include 全局性的头文件
Rule20 代码文件(.c)须要include 全局头文件以及相关头文件
4 代码风格和间隔
Rule21 在不论什么修改的文件都须要加上公司confidential的标识
/* -------------------------------------------------------------------------------
copyright (C) 2011,Nollec Wireless CO. LTD. All Rights Reserved
Revision History:
Bug/Feature ID Author Modification Date Description
------------------ ------------------- ------------------ ---------------------
BugID/FeatureID developer name YYYY/MM/DD brief discription
----------------------------------------------------------------------------------*/
Rule22 在不论什么修改或者新建的文件都须要加上公司confidential的标识
Rule23 Revision History 在Feature开发完毕或Bug解决完毕后必须更新
Rule24 全部的Comments必须用英文填写,而且不能嵌入
Rule25 代码缩进的时候不要用Tab,用4个空格取代
// 跟编辑器有关,可设置
void func()
{
if (something bad)
{
...
if (another thing bad)
{
}
}
Rule26 Switch 必须有default
switch (testValue)
{
case VALUE_1:
/* Body for case 1. */
break;
case VALUE_2:
/* Body for case 2. */
break;
default:
/* Body for default. */
break;
}
Rule27 不要在 . 或-> 前后有空格
Rule28 变量的声明应尽量控制到小的范围内
Rule29 指针 * 应该紧跟类型之后。 地址 &应该在变量名之前
Rule30 变量常量定义一定要有意义。不要用magic number
x = 100*10+1; //NOT ALLOWednumber = 100*10+1;
Rule31 每一个变量定义都要分行写。并且一定要给初值
UINT8 i,j; /* NOT RECOMMENDED */
UINT8 i = INIT_VALUE; /* GOOD */
UINT8 j = INIT_VALUE; /* GOOD */
Rule32 全部状态变量或者enum的变量要明白赋予其值
/* INCORRECT*/
if (cpCurrentState == CP_L3_STATE_TYPE_D1)
{
cpCurrentState++;
}
/*CORRECT*/
if (cp_currentState == CP_L3_STATE_TYPE_D1)
{
cp_currentState = CP_L3_STATE_TYPE_D2;
}
Rule33 全部global的声明都要在一个header文件中
Rule34 常量声明须要有明白含义
(Does not meet requirements)
#define ONE 1
#define TWO 2
(Meets requirements)
#define NUM_LOOPS_FOR_AD_READ 4
#define NUM_SAMPLES_TAKEN 8
Rule35 一个constant不能付给另外一个constant
Rule36 NULL仅仅用于指针的初始化和比較
Rule37 常量用在编译开关时候,一定要在编译控制的区域内
#define DEBUG 4
/* if undefined,disables debugging */
/* set to 1 - 4 for desired debugging level */
/* This usage of DEBUG in the for loop control statement is
* allowed since the statement is fully enclosed within the
* conditionally compiled section of code.
*/
#ifdef DEBUG
for (i = 0; i < DEBUG; i++)
{
printf("i = %d\n",i);
}
#endif
Example 31 - Example (Incorrect Usage)
#define DEBUG 4
#ifdef DEBUG /* usage here is fine */
/* do something special */
#endif
/* the code statement below is outside the segment controlled by
* the #ifdef and therefore should NOT use DEBUG.
*/
for (i = 0; ((i < 5) && DEBUG); i++)
{
printf("i = %d\n",i);
}
Rule38 #ifdef #endif 用于编译时要有足够的凝视。并且#endif要有 //凝视相应的#ifdef
Rule39 用typedef 而不是#define来定义类型
Rule40 下列类型应在全局头文件中定义,并应用于代替C语言int类型:
INT8:此类型存储8位有符号数值。
UINT8:此类型存储8位无符号数值。
INT16:此类型存储16位有符号数值。
UINT16:此类型存储16位无符号数值。
INT32:此类型存储32位有符号数值。
UINT32:此类型存储32位无符号数值。
布尔值:理想情况下,此类型是枚举类型,将布尔值命名为TRUE(1)和FALSE(0)。但是,有些编译器可能无法有效地存储此内容。另一种方法是typedef UINT8 BOOLEAN;
它简单地将BOOLEAN定义为一个8位无符号值,与UINT8不同。在这种情况下,常量TRUE和FALSE必须是定义的常量。
Rule42 不要使用没有明白定义的參数
Rule43 函数return指针假设failure。则须要return NULL
Rule44 函数參数是单列数组不须要明白大小
(Correct Usage)
void functionName
(
UINT8 x[],/* array with "size" elements */
UINT8 size /* number of elements in x */
);
(Incorrect Usage)
void functionName (UINT8 x[10]);
Rule45 不论什么宏定义的拓展须要加上括号来限定
(Correct):
#define A_CONSTANT (ANOTHER_CONSTANT + 1)
a = ACONSTANT * 2;
(Incorrect):
#define A_CONSTANT ANOTHER_CONSTANT + 1
a = ACONSTANT * 2;
Flow control,expressions
Rule46 Switch case必需要有break结束
Rule47 Switch default必需要有来控制以外情况
Rule48 不要使用Goto
Rule49 在比较的时候 左边要放常量
// NOT RECOMMENDED,imagine you forget one of the “=” signs
If (PHONE == IS_RESET)
{
}
// GOOD,the following statement eliminates the possible errors explained above
// and easier to follow the value that you are looking for
If (IS_RESET == PHONE)
{
}
Rule50 在使用else if的时候,else的部分须要加上
Rule51 if/else/while/for/do的区块不管一行还是多行,一定要加{}
// NOT RECOMMENDED
if (something)
if (something else)
doThis();
else
while (input)
doThat();
// GOOD
if (something)
{
if (something else)
{
doThis();
}
else
{
while (input)
{
doThat();
}
}
}
Memory
Rule52 一定保证从调用函数分配的内存在使用完成后释放内存,一定在此调用函数凝视提醒
Dangerous memory management
error_code_type* myfunction(void)
{
error_code_type* p_temp = malloc (sizeof(error_code_type));
return p_temp;
/* p_temp is never de-allocated and the user of myFunc cannot de-allocate*/
/* because a temporary copy of that instance is returned.*/
/* Calling user code shall take of the memory deallocating which will create*/
/* complexity and confusion*/
}
Rule53 在deference引用指针之前一定要对指针判定是否为NULL
UINT32* p_number = NULL;if (NULL == p_number){}
其它
Rule54 编译器相关的扩展在有必要的时候使用
#ifdef _HC11_
#define DIRECT _direct_ram
#else /* not _HC11_ */
#define DIRECT
#endif
/* nSize located in direct RAM in embedded,normal RAM in UNIX */
DIRECT UINT8 nSize;
Rule55 编译器相关的扩展在有必要的时候使用
Rule56 全部丢失性的类型转换要明白cast
INT8 signed_value;
UINT16 long_value;
UINT8 short_value;
/* Loss here is in accuracy going from signed to unsigned */
signed_value= (UINT8) short_value;
/* Loss here is in size,going from a 16 bit value to an 8 bit */
signed_value= (INT8) long_value;
Rule57 数组的访问仅仅能用方括号的形式访问,不要使用deference * 来访问
/*INCORRECT*/
*(masterList + 10) = 0;
/*CORRECT*/
masterList[10] = 0;
Rule58 在condition如果确定要利用肯定的逻辑