编程规范---项目开发注意【原创】

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

如有转载请注明出处

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. \r\n");
}

for (i = 0; i < 5; i++) {
    printf("Hellor world. \r\n");
}

switch (cnt) {
    case 1:
        printf("Hellor world. \r\n");
        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

 

posted @ 2016-09-18 13:54  Sky&Zhang  阅读(661)  评论(0编辑  收藏  举报