编程规范---项目开发注意【原创】
下面我谈一谈编码规范的问题,是本人的一点经验总结
如有转载请注明出处
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
【作者】sky
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.