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的成员变量有下面规则
名字 | 标记 | 演示样例 |
---|---|---|
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
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 ReservedRevision 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);
}
#endifExample 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();elsewhile (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如果确定要利用肯定的逻辑
c语言 编码规范 C Coding Standard相关推荐
- Google重磅发布Go语言编码规范
前言 Google官方在2022.11.23重磅发布了Go语言编码规范. 这个编码规范源自于Google内部的Go项目,是Google的开发人员要遵守的代码规范. 在Go语言诞生后,全世界的Go开发者 ...
- Java语言编码规范(1)
Java语言编码规范 原文出处http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html 2 文件名(File Names) 这部分列出了常 ...
- c语言把一段编码注释,C语言编码规范——着重注意点整理
C语言编码规范--着重注意点整理 发布时间:2018-05-26 21:50, 浏览次数:260 C语言编码规范--着重注意点整理 编码规范的目的: 保证不同背景和经历的开发同学可以良好的协同开发 保 ...
- 【转】嵌入式软件:C语言编码规范
引 言 嵌入式系统是指以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能.可靠性.成本.体积和功耗严格要求的专门计算机系统.嵌入式技术并不是一个独立的学科,它是伴随着微电子技术和计算 ...
- C语言编码规范——着重注意点整理
C语言编码规范--着重注意点整理 编码规范的目的: 保证不同背景和经历的开发同学可以良好的协同开发 保证组织级的开发技能和经验得以共享和传承 编程最难的是命名!因为其他的算法.数据结构都有据可循. 命 ...
- 【转载】Uber Go语言编码规范
文章目录 Uber Go语言编码规范 一. 介绍 二. 指导原则 指向interface的指针 接收器(receiver)与接口 零值Mutex是有效的 在边界处拷贝Slices和Maps 接收Sli ...
- Uber Go 语言编码规范
Uber Go 语言编码规范 Uber 是一家美国硅谷的科技公司,也是 Go 语言的早期 adopter.其开源了很多 golang 项目,诸如被 Gopher 圈熟知的 zap.jaeger 等.2 ...
- C语言编码规范汇总篇
PDF资源链接:https://download.csdn.net/download/rootcode/11614413 或自己复制以下文章即可! C语言编码规范 1--文件与目录 1.文件及目录的命 ...
- Java语言编码规范
目录1 介绍 1.1 为什么要有编码规范 1.2 版权声明 2 文件名 2.1 文件后缀 2.2 常用文件名 3 文件组织 3.1 Java源文件 3.1.1 开头注释 3.1.2 包和引入语句 3. ...
最新文章
- 2022-2028年中国普鲁兰多糖行业市场分析及投资前景研究报告
- NetScaler的部署实验之二NetScaler的传输环路值的设定
- 双机热备+Win2003下集群案例
- 绝症老父亲即将说不了话,儿子用AI技术挽留他的声音
- python处理流程-Python文件处理流程
- ubuntu安装搜狗输入法的相关问题
- 大型分布式网站术语分析 15 条,你知道几条?
- Entity Framework 学习中级篇3—存储过程(中)
- hadoop安装笔记-cdh4
- 避开Google Voice Search利用Google Speech API实现Android语音识别
- MailBee.NET Objects接收电子邮件(POP3)教程一:接收简单的电子邮件
- [CF808B] Average Sleep Time([强行]树状数组,数学)
- c++题目大坑:分数化小数
- [解决]RESTEASY003215: could not find writer for content-type text/html type: java.lang.String
- 一款好用的取色工具TakeColor
- 信捷plc485通信上位机_变频器、触摸屏和PLC建立MODBUS RTU通信的方法
- 机房收费系统——可行性研究报告
- arcgis的lyr样式转qgis的sld样式
- Mac无法开机?别着急看这里
- 输入两个已经按从小到大顺序排列好的字符串,编写一个合并两个字符串的函数,使合并后的字符串,仍然是从小到大排列。