FW开发代码规范---小任性(2)
三、空行
(1)在每个函数、结构体、枚举定义结束之后都要加空行。
在一个函数体内,逻辑密切相关的语句之间不加空行,其它地方应加空行分隔。
|
struct st1 { … }; // 空行 enum { … }; // 空行 void Function1(…) { … } // 空行 void Function2(…) { … } |
// 空行 while (condition) { statement1; // 空行 if (condition) { statement2; } else { statement3; } // 空行 statement4; } |
函数之间的空行 函数内部的空行
相对独立的程序块之间、变量说明之后必须加空行。
|
if (!isLockCardSucc) { ... // program code } GetLockPhoneInfo(&stLockPhoneInfo); |
if (!isLockCardSucc) { ... // program code } //空格 GetLockPhoneInfo(&stLockPhoneInfo); |
不规范代码 规范代码
(2)代码行
一行代码只做一件事情,如只定义一个变量,或只写一条语句。这样的代码容易阅读,并且方便于写注释。
if、for、while、do等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加{}。这样可以防止书写失误。
|
int width, height, depth;// 宽度高度深度 |
int width; // 宽度 int height; // 高度 int depth; // 深度 |
|
X = a + b; y = c + d; z = e + f; |
x = a + b; y = c + d; z = e + f; |
|
if (width < height) DoSomething(); |
if (width < height) { DoSomething(); } |
|
for (initialization; condition; update) DoSomething(); Other(); |
for (initialization; condition; update) { DoSomething(); } // 空行 Other(); |
不规范代码 规范代码
(3)代码行内的空格
关键字之后要留空格。const、static等关键字之后至少要留一个空格,否则无法辨析关键字;if、for、while、switch等关键字之后应留一个空格再跟左括号‘(’,以突出关键字。
函数名之后不要留空格,紧跟左括号‘(’,以与关键字区别。
‘(’向后紧跟,‘)’、‘,’、‘;’向前紧跟,紧跟处不留空格。
‘,’之后要留空格,如Function(x, y, z)。如果‘;’不是一行的结束符号,其后要留空格,如for (initialization; condition; update)。
赋值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符,如“=”、“+=” “>=”、“<=”、“+”、“*”、“%”、“&&”、“||”、“<<”,“^”等二元操作符的前后应当加一个空格。
一元操作符如“!”、“~”、“++”、“--”、“&”(取地址运算符)等前后不加空格。
象“[]”、“.”、“->”这类操作符前后不加空格。
对于表达式比较长的for语句和if语句,为了紧凑起见可以适当地去掉一些空格,如for (i=0; i<10; i++)和if ((a<=b) && (c<=d))
|
void Func1(int x, int y, int z); |
void Func1 (int x,int y,int z); |
|
if (year >= 2000) |
if(year>=2000) |
|
if ((a>=b) && (c<=d)) if ((a >= b) && (c <= d)) |
if(a>=b&&c<=d) |
|
for (i = 0; i < 10; i++) for (i=0; i<10; i++) |
for(i=0;i<10;i++) |
|
x = a < b ? a : b; |
x=a<b?a:b; |
|
i++; int *x = &y; |
i ++; int * x = & y; |
|
array[5] = 0; a.Function(); b->Function(); |
array [ 5 ] = 0; a . Function(); b -> Function(); |
良好风格 不好的风格
(4)对齐缩进
程序块的分界符(如‘{’和‘}’)应各独占一行并且位于同一列,同时与引用它们的语句左对齐。在函数体的开始、类的定义、结构的定义、枚举的定义以及if、for、do、while、switch、case语句中的程序都要采用如上的缩进方式。
|
for (...) { ... // program code } |
for (...) { ... // program code } |
|
if (...) { ... // program code } |
if (...) { ... // program code } |
|
void example_fun( void ) { ... // program code } |
void ExampleFun( void ) { ... // program code } |
不规范代码 规范代码
预处理指令不需要缩进,总是从行首开始。即使预处理指令位于缩进代码块中,指令也应从行首开始。
|
// 良好风格:预处理指令均从行首开始 if (lopsidedScore) { #if DISASTER_PENDING // Correct -- Starts at beginning of line DropEverything(); #if NOTIFY NotifyClient(); #endif #endif BackToNormal(); } |
|
// 不良风格:缩进的预处理指令 if (lopsidedCore) { #if DISASTER_PENDING // Wrong! The "#if" should be at beginning of line DropEverything(); #endif // Wrong! Do not indent "#endif" BackToNormal(); } |
若函数或过程中的参数较长,则要进行适当的划分。
|
if ((veryLongerVariable1 >= veryLongerVariable12) && (veryLongerVariable3 <= veryLongerVariable14) && (veryLongerVariable5 <= veryLongerVariable16)) { DoSomething(); } |
|
reportOrNotFlag = ((taskNo < MAX_ACT_TASK_NUMBER) && (actTaskTable[taskNo].resultData != 0)); |
|
statStrCompare((uchar *) & statObject, (uchar *) & (actTaskTable[taskNo].statObject), sizeof (STAT_OBJECT_T)); |
长行的拆分
四、杂项
基本类型定义要统一,由于C语言本身没有对数据类型的长度进行严格规定,导致不同类型的编译器中基本数据类型的长度不一致,例如有的编译器可能把long型解释成32位,有的则解释成64位,为了避免出现这种情况时,需要改动所有的代码,所以我们会统一定义一些基本类型,程序其他部分应该使用这些定义的基本类型,而不是直接使用C自带的类型。在嵌入式系统中我们最常使用的就是各种长度的整型,因此对它们统一定义如下:
|
typedef unsigned char uchar; typedef unsigned char uint8; typedef unsigned short uint16; typedef unsigned long uint32; typedef unsigned long long uint64; typedef char sint8; typedef short sint16; typedef long sint32; typedef long long sint64; typedef uint32 boolean; |
为了防止头文件被重复引用(会导致类型重定义错),应当增加包含岗哨——使用#ifndef/#define/#endif结构产生预处理块。
|
#ifndef _STAR_LIB_H_ // 防止StarLib.h被重复引用 #define _STAR_LIB_H_ … #endif //_STAR_LIB_H_s |
定义宏的时候,宏的参数应该尽量用括号括起来, 此外在调用带参数的宏时,宏参数不要带自加或自减操作符。
|
#define MIN(a,b) ( a > b ? b : a) |
#define MIN(a,b) ( (a) > (b) ? (b) : (a)) |
|
#define SQUARE(a) ((a)*(a)) SQUARE(a++) //错误 |
#define SQUARE(a) ((a)*(a)) SQUARE(a); a++; |
在写复杂表达式的时候,尽量不要使用语言的默认优先级,哪怕你非常熟悉,但是看的人不一定熟悉, 应该尽量使用括号来表示优先级。
|
If (a & b || c & d) { … } |
If ((a & b) || (c & d)) { … } |
定义结构体类型时,尽量把数据类型大的放在前面,这样容易差生紧凑的结构。不要数据类型大的和小的混在一起,这样容易在数据区产生浪费空间。如果确实需要把小的类型放在前面,注意把几个小得放在一起。
|
typedef struct { uint8 a; uint32 b; uint8 c; uint32 d; uint8 e; uint32 f; }XXX_T, *pXXX_T; 这种方式结构体需占用24 Bytes |
Typedef struct { uint32 b; uint32 d; uint32 f; uint8 a; uint8 c; uint8 e; }XXX_T, *pXXX_T; 或者如下: Typedef struct { uint8 a; uint8 c; uint8 e; uint8 rserved; uint32 b; uint32 d; uint32 f; }XXX_T, *pXXX_T; 这两种方式结构体占用16 Bytes |
判断条件尽可能用正逻辑。说明:用正逻辑比较容易理解,而用反逻辑则常让人费解。
|
If (!bNotDoSomethingFlag) { … } |
If (bDoSomethingFlag) { … } |
FW开发代码规范---小任性(2)的更多相关文章
- FW开发代码规范---小任性(1)
---恢复内容开始--- 使代码容易理解的方法无非是准确地注释和增强代码一致性. 一个好的准确的注释让代码容易理解是显然的.而代码的一致性,使编程风格统一,容易在内部形成一些共识.习惯用语和模式. 一 ...
- Android开发代码规范(转)
Android开发代码规范 1.命名基本原则 在面向对象编程中,对于类,对象,方法,变量等方面的命名是非常有技巧的.比如,大小写的区分,使用不同字母开头等等.但究其本,追其源,在为一个资源其名称 ...
- web前端开发 代码规范 及注意事项
web前端开发 代码规范 及注意事项 外部命名规范 html .js .css文件名称命名规范 my_script.js my_camel_case_name.css my_index.html 路径 ...
- Web 前端开发代码规范(基础)
一. 引言 对于一个多人团队来说,制定一个统一的规范是必要的,因为个性化的东西无法产生良好的聚合效果,规范化可以提高编码工作效率,使代码保持统一的风格,以便于代码整合和后期维护. 二. HTML/CS ...
- Android开发代码规范
目录 1.命名基本原则 2.命名基本规范 2.1编程基本命名规范 2.2分类命名规范 3.分类命名规范 3.1基本数据类型命名规范 3.2控件命名规范 3.3变量命名规范 3.4整个项目的目录规范化 ...
- Extjs4前端开发代码规范参考
准则: 一致性, 隔离与统一管理, 螺旋式重构改进, 消除重复, 借鉴现有方案 1. 保证系统实现的一致性,寻求一致性方案, 相同或相似功能尽量用统一模式处理: 2. 尽可能使用隔离技术 ...
- iOS开发代码规范(通用)
1. 关于命名 1> 统一要求 含义清楚,尽量做到不需要注释也能了解其作用,若做不到,就加注释 使用全称,不适用缩写 2> 类的命名 大驼峰式命名:每个单词的首字母都采用大写字母 例子:M ...
- IOS开发-代码规范
代码风格的重要性对于一个团队和项目来说不言而喻.网上有许多 Objective-C 的代码风格,但这份简洁而又最符合苹果的规范,同时有助于养成良好的代码习惯,也是我们团队一直遵循的代码风格. 写法没有 ...
- iOS开发代码规范
1.关于命名 1.1统一要求 含义清楚, 尽量做到不需要注释也能了解其作用,若做不到,就加注释 使用全称不使用缩写 1.2类的命名 大驼峰式命名:每一个单词的首字母都采用大写字母例子: MFHomeP ...
随机推荐
- OC面向对象—多态
OC面向对象—多态 一.基本概念 多态在代码中的体现,即为多种形态,必须要有继承,没有继承就没有多态. 在使用多态是,会进行动态检测,以调用真实的对象方法. 多态在代码中的体现即父类指针指向子类对象. ...
- .htaccess根据IP地址限制访问
屏蔽IP地址 屏蔽IP地址有时是非常必要的,比如对于一个外贸公司网站,来自国内的访问是不会带来任何经济效益的,而且还占用服务器资源,造成访问延迟等问题. 如果要屏蔽某一特定IP可以使用: order ...
- Xib与View关联方法
1,在需要实例的地方 //加载一个uiview的作法 [LotteryInvestigationView *lotteryInvestigationView=[[[NSBundle mainBundl ...
- 为什么使用 Bootstrap?
为什么使用 Bootstrap? 移动设备优先:自 Bootstrap 3 起,框架包含了贯穿于整个库的移动设备优先的样式. 浏览器支持:所有的主流浏览器都支持 Bootstrap. 容易上 ...
- 【62测试】【状压dp】【dfs序】【线段树】
第一题: 给出一个长度不超过100只包含'B'和'R'的字符串,将其无限重复下去. 比如,BBRB则会形成 BBRBBBRBBBRB 现在给出一个区间[l,r]询问该区间内有多少个字符'B'(区间下标 ...
- 转帖不会乱码的,powershell网络蜘蛛
抓取(爬取)网上信息的脚本程序,俗称网络蜘蛛.powershell中自带了这样的两个命令,[Invoke-WebRequest]和[Invoke-RestMethod],但这两个命令有时候会乱码. 现 ...
- 排序小结(java版)
一.归并排序 package org.lxh.demo08.b; class Sort { private int[] a; private int n; Sort(int n) { a=new in ...
- (C语言)结构体成员的引用->(箭头)和 .(点)
关于结构体成员的引用有这样的规律: 箭头(->):左边必须为指针: 点号(.):左边必须为实体. 那么如果一个结构体指针引用一个成员,这个成员又是一个结构体(并且是一个实体),那么如果要引用这个 ...
- ubuntu fix the grub boot(need Internet)
sudo add-apt-repository ppa:yannubuntu/boot-repair sudo apt-get update sudo apt-get install -y boot- ...
- JQuery源码解析(十)
默认回调对象设计 不传入任何参数,调用add的时候将函数add到内部的list中,调用fire的时候顺序触发list中的回调函数: function fn1(val) { console.log('f ...