c语言 编码规范 C Coding Standard

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 不要使用保留名字

Rule7 代码文件以.h, .c 结尾

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的成员变量有下面规则

名字标记演示样例
statics_static UINT8 s_some_number
statics_static UINT8 s_some_number
constantc_const UINT8 c_some_number
 cp_const user_data_type* cp_user_data

3 Files

Rule16 每一个include的必须有机制防止多重包括

#ifndef FOO_H
#define FOO_H
        
/* The rest of the file*/
  	      
#endif

Rule17 相对路径的linux文件不同意出如今#include里

// NOT ALLOWED
#include <../foo/include/foo.h>

Rule18 头文件不同意有实现的代码

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必须是定义的常量。

Rule41 一个函数应该仅仅有一个return出口

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如果确定要利用肯定的逻辑

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值