三、空行

  (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)的更多相关文章

  1. FW开发代码规范---小任性(1)

    ---恢复内容开始--- 使代码容易理解的方法无非是准确地注释和增强代码一致性. 一个好的准确的注释让代码容易理解是显然的.而代码的一致性,使编程风格统一,容易在内部形成一些共识.习惯用语和模式. 一 ...

  2. Android开发代码规范(转)

    Android开发代码规范 1.命名基本原则    在面向对象编程中,对于类,对象,方法,变量等方面的命名是非常有技巧的.比如,大小写的区分,使用不同字母开头等等.但究其本,追其源,在为一个资源其名称 ...

  3. web前端开发 代码规范 及注意事项

    web前端开发 代码规范 及注意事项 外部命名规范 html .js .css文件名称命名规范 my_script.js my_camel_case_name.css my_index.html 路径 ...

  4. Web 前端开发代码规范(基础)

    一. 引言 对于一个多人团队来说,制定一个统一的规范是必要的,因为个性化的东西无法产生良好的聚合效果,规范化可以提高编码工作效率,使代码保持统一的风格,以便于代码整合和后期维护. 二. HTML/CS ...

  5. Android开发代码规范

    目录 1.命名基本原则  2.命名基本规范 2.1编程基本命名规范 2.2分类命名规范 3.分类命名规范 3.1基本数据类型命名规范 3.2控件命名规范 3.3变量命名规范 3.4整个项目的目录规范化 ...

  6. Extjs4前端开发代码规范参考

    准则:  一致性, 隔离与统一管理, 螺旋式重构改进, 消除重复, 借鉴现有方案 1.    保证系统实现的一致性,寻求一致性方案, 相同或相似功能尽量用统一模式处理: 2.    尽可能使用隔离技术 ...

  7. iOS开发代码规范(通用)

    1. 关于命名 1> 统一要求 含义清楚,尽量做到不需要注释也能了解其作用,若做不到,就加注释 使用全称,不适用缩写 2> 类的命名 大驼峰式命名:每个单词的首字母都采用大写字母 例子:M ...

  8. IOS开发-代码规范

    代码风格的重要性对于一个团队和项目来说不言而喻.网上有许多 Objective-C 的代码风格,但这份简洁而又最符合苹果的规范,同时有助于养成良好的代码习惯,也是我们团队一直遵循的代码风格. 写法没有 ...

  9. iOS开发代码规范

    1.关于命名 1.1统一要求 含义清楚, 尽量做到不需要注释也能了解其作用,若做不到,就加注释 使用全称不使用缩写 1.2类的命名 大驼峰式命名:每一个单词的首字母都采用大写字母例子: MFHomeP ...

随机推荐

  1. JavaEE SSH框架整合(四) 日志处理Spring结合 log4j、slf4j [转]

    1. 加入log4j和slf4j的jar包 2. web.xml: <context-param> <!--log4j配置地址 --> <param-name>lo ...

  2. WPF 让Enter键按下时默认为某按钮(Button)事件

    在编写web程序时我们经常用到按Enter键来提交表单,在WPF中我们也常常需要这样的功能:例如在填写登录框信息时当填写完密码之后我希望直接按Enter键就能完成登录操作.这个需求如何来完成呢? 其实 ...

  3. jQuery键盘控制方法,以及键值(keycode)对照表

    键盘控制应用范围非常广泛,比如快捷键控制页面的滚动:在填写表单时候,限制输入内容:或者是屏蔽复制.粘贴.退后等功能.这里说说用jQuery比原生态的JS好用,代码简单清晰,不要问我JS怎么写,因为我不 ...

  4. 1、Centos 7 系统的初化始配置

    1.IP的配置临时生效: ifocnfig 主机名 IP地址(如 ) 永久生效(需要进入配置文件): vi /etc/sysconfig/network-scripts/ifcfg-主机名 2.主机名 ...

  5. cas 在.net 下的单点登录实现及 ,Net Mvc的接入

    最近在研究单点登录,发现用的最广的就是cas了,查了下资料,发现有人写了详细的说明 地址:http://www.cnblogs.com/zhenyulu/archive/2013/01/22/2870 ...

  6. Hibernate原生SQL查询多表关联,SQL语句要注意的问题

    Hibernate原生SQL查询多表关联,SQL语句要注意的问题 @for&ever 2009-9-4 系统环境: MySQL5.1 Hibernate3.3 有如下的假定: 实体类 Ques ...

  7. supervisor安装配置与使用

    supervisor:C/S架构的进程控制系统,可使用户在类UNIX系统中监控.管理进程.常用于管理与某个用户或项目相关的进程. 组成部分supervisord:服务守护进程supervisorctl ...

  8. 浅谈SEO-收录(二)

    如何更好的让搜索引擎收录网站中的内容,想要被良好的收录,可以尝试一下几点: 一.机器可读 百度通过一个叫做Baiduspider的程序抓取互联网上的网页, 经过处理后建入索引中,目前只支持读文本,fl ...

  9. WAMPSERVER 与 IIS冲突 及如何修改网站根目录

    如果之前打开过IIS服务或者用过xampp则输入localhost时,浏览器显示如下: 这说明WAMPSERVER 与 IIS服务的默认端口冲突: 可以测试80端口是否被占用: 如上端口被IIS服务占 ...

  10. select、poll、poll的比较(转)

    原文地址:http://www.cnblogs.com/xuxm2007/archive/2011/08/15/2139809.html select.poll.epoll的比较 linux提供了se ...