• 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)

    {

        …

    }

  • 相关阅读:
    mysql5.6 TIME,DATETIME,TIMESTAMP
    CMake 简单介绍 图
    mysql 源码编绎修改 FLAGS,调试MYSQL
    CHAR 详解
    关于MySQL的各种总结
    Shell编程速查手册
    cmake 手册系列
    编译安装GCC 5.2.0
    宽字符相关的输入输出
    Makefile
  • 原文地址:https://www.cnblogs.com/Caden-liu8888/p/5973247.html
Copyright © 2020-2023  润新知