zoukankan      html  css  js  c++  java
  • 编程规范---项目开发注意【原创】

    下面我谈一谈编码规范的问题,是本人的一点经验总结

    如有转载请注明出处

    1. 接口书写,要稳定,健壮,函数内部失败后不会影响现场的原有环境。

        这里的稳定是说需要进行压力测试,不会导致系统死机崩溃的问题,健壮是有各种容错机制,可恢复现场。

    2. 多进程、多线程的调用,中断的调用,避免死锁,内存泄露。

    3. 考虑产品需求和用户体验,代码的可移植性,什么bug需要修改驱动,什么bug需要修改应用,清楚每一层的定位。

       保证产品的稳定性,比方说通信不断开,不影响用户使用的体验

    4. 注意编译过程与代码执行过程,编译会影响代码,头文件等要有容错机制

    5. 内联函数的使用,unlikely likely 优先运行

    6. 无用参数需要消除警告

    7. 打印语句的使用,产品是不能有printk/printf等语句的。因为怕信息流出泄露,而被黑客攻击。

    8. 一个项目的立项,采购选用的芯片、材料、封装等等要与硬件、研发进行确认,可能项目需求不同,并不是所有的封装都可以使用,某些安全性产品尤为注意。

    9. 打印的时候是不允许任务切换的,针对RTOS和单片机


    编程风格请自行参考Linux内核源码的代码,Linux内核源码请参考kernel目录下的代码,自行上网上下载源码去参考
    
    1、【条件语句】(if for while switch enum struct )中括号:
    if (count < 5) {
        printf("Hellor world. 
    ");
    }
    
    for (i = 0; i < 5; i++) {
        printf("Hellor world. 
    ");
    }
    
    switch (cnt) {
        case 1:
            printf("Hellor world. 
    ");
            break;
            
        case 2:
            break;
            
        default:
            break;
    }
    
    2、【函数实现中括号】
    void function(void)
    {
    
    }
    
    3、【全局变量前缀都带g_】
    例如:
    uint8 g_name[10];
    
    4、【宏定义,enum类型全部用大写字母】
    例:
    #define REV_PARAMS_TIMEOUT_MS       (20000)
    typedef enum {
        BT_PROTOCOL_ERROR_NON = 0,
        BT_PROTOCOL_ERROR_BUSY,
        BT_PROTOCOL_ERROR_SEND_FAIL,
    
    }bt_protocol_error_code_t;
    
    5、【typedef 的结构体】
    typedef 不是所有的结构体变量都要这样用,linux kernel中很多结构体并没有使用typedef,
    所以我们能不用还是选择不要用tyepdef 来定义结构体
    例:
    typedef enum {
        BT_PROTOCOL_ERROR_NON = 0,
    }bt_protocol_error_code_t;
    
    typedef struct cmd_struct {
        uint16_t cmd;
    }tCMD_STRUCT, *tP_CMD_STRUCT;
    
    enum用法,必须要有枚举类型
    enum bt_flag {
        BT_PROTOCOL_ERROR_NON = 0,
    };
    
    结构体通用法:(推荐)
    struct input_num {
        unsigned int data;
        char *name;
    };
    
    某种结构体互相嵌套的用法例子:
    【方法一】
    typedef  struct MY_DATA  tMY_DATA;
    typedef struct {
        u16 *key_table;
        u16 size;
    }tBOARD;
    
    struct MY_DATA {
        u8 enable;
        u8 mt_slots;
    };
    
    typedef struct {
        int (*init)(tMY_DATA* keydata);
        int (*release)(tMY_DATA* keydata);
        int (*suspend)(tMY_DATA* keydata);
        int (*resume)(tMY_DATA* keydata);    
        int (*open)(tMY_DATA* keydata);
        int (*close)(tMY_DATA* keydata);
    }tMY_OPS;
    
    【方法二】
    #define NB_BUFFER 4
    struct video_device;
    struct video_operations;
    typedef struct video_device tVIDEO_DEVICE, *tP_VIDEO_DEVICE;
    typedef struct video_operations tVIDEO_OPS, *tP_VIDEO_OPS;
    
    struct video_device {
        int i_fd;
        int i_pixel_format;
        int i_width;
        int i_height;
    
        int i_video_buf_cnt;
        int i_video_buf_max_len;
        int i_video_buf_current_index;
        unsigned char *puc_vide_buf[NB_BUFFER];
    
        /* 函数 */
        tP_VIDEO_OPS pt_ops;
    };
    
    typedef struct video_buf {
        tPIXELDATA pixel_datas;
        int i_pixel_format;
    }tVIDEO_BUF, *tP_VIDEO_BUF;
    
    struct video_operations {
        char *name;
        int (*init_device)(char *str_dev_name, tP_VIDEO_DEVICE pt_video_device);
        int (*exit_device)(tP_VIDEO_DEVICE pt_video_device);
        int (*get_frame)(tP_VIDEO_DEVICE pt_video_device, tP_VIDEO_BUF ptVideoBuf);
        int (*get_format)(tP_VIDEO_DEVICE pt_video_device);
        int (*put_frame)(tP_VIDEO_DEVICE pt_video_device, tP_VIDEO_BUF pt_video_buf);
        int (*start_device)(tP_VIDEO_DEVICE pt_video_device);
        int (*stop_device)(tP_VIDEO_DEVICE pt_video_device);
        struct video_operations *pt_next;
    };
    
    6.【typedef函数指针】    
    typedef void (func_name_t * ) (void );
    宏名用小写字母
    
    6、所有只用在本文件的函数,全局变量均要加上static前缀
    
    7、所有不带参数的函数都要带上void,例:
    uint8_t function(void);
    
    
    8、所有变量函数全部用字母小写加下划线"_"组合。
    
    9、所有代码文件全部用utf-8 without signature格式
    
    10、所有代码禁止出现中文。一律全英文,注释可以用中文,对于项目来讲,根据打印信息的中英文根据项目情况来定
    
    11、编译禁止出现任何警告信息,要求在gcc编译器下是零警告
    
    12、关键功能函数必须要写注释:
    注释里面要写明函数功能,入口参数定义
    例:
    
    /**
     * 1. xxxx
     * 2. xxxx
     */
    
    int set_gpio(int value, int num)
    {
    
    }
    13、如果不是全局函数,只在当前文件使用的函数必须要加入static

    欢迎交流,如有转载请注明出处

    新浪博客:http://blog.sina.com.cn/u/2049150530
    博客园:http://www.cnblogs.com/sky-heaven/
    知乎:http://www.zhihu.com/people/zhang-bing-hua

  • 相关阅读:
    澳门两日游之续一
    记澳门两日游0516
    [原创]北大ACM POJ 1050题解
    [原创]百度之星低频词过滤题解
    [原创]百度之星题解之重叠区间大小
    澳门两日游之续三
    澳门两日游之续二
    [原创]LZW网页判重的题解
    [原创]北大ACM POJ 1032题解
    创建产品列表控件时触发自定义DataUpated事件时,设置MultiView.ActiveViewIndex无效
  • 原文地址:https://www.cnblogs.com/sky-heaven/p/5881372.html
Copyright © 2011-2022 走看看