每个公司都会有自己代码风格或者编程规范,都旨在防范编程语言的一些陷阱或者提高代码效率,还有就是保持一致编码风格来提高代码可读性,方便code review;

或者说代码的一种美学,比如python也就有pep8约定,还有一些精致编码来表示你是否Pythonic。

DPDK也有自己的编码风格,看完颇有受益,这里提取一些个人比较喜欢的风格来参考,尤其是关于结构体部分。

1、注释风格,参考doxygen的使用

单行注释:

/*
* VERY important single-line comments look like this.
*/

或者

/* Most single-line comments look like this. */

多行注释:

/*
* Multi-line comments look like this. Make them real sentences. Fill
* them so they look like real paragraphs.
*/

2、头文件包含

标准库和dpdk提供的库头文件都使用<>包含,其他应用程序的头文件都使用 ""包含

 #include <stdio.h>
#include <rte_eal.h>
#include "application.h"

3、预编译头

 #ifndef _FILE_H_
#define _FILE_H_
/* Code */
#endif /* _FILE_H_ */

4、结构体定义

(1)声明结构体成员变量的时候,首先按方便使用排序,然后按字节大小排序(从大到小),然后再按字典表排序,并且考虑最小的字节填充来保证字节对齐。

按方便使用排序是意思是把常用的成员变量放在一起,突出整个结构体的逻辑性

(2)对于已经声明好的结构体,如果要添加新的成员,应该添加在结构体的尾部来保证向后兼容,但我个人觉得这个在遵守第(1)条的情况下,才考虑这条。

(3)结构体的每个元素都应该在单独的一行。

(4)成员变量的类型起始对齐,变量名使用空格对齐第一个字符。

(5)对于类型特别长的变量,不方便对齐,就用一个空格的间隔书写。

 struct foo {
struct foo *next; /* List of active foo. */
struct mumble amumble; /* Comment for mumble. */
int bar; /* Try to align the comments. */
struct verylongtypename *baz; /* Won't fit with other members */
};

(6)结构体声明放在所使用文件的代码起始部分,或者在一个单独的头文件里,方便其他文件包含。

(7)变量的声明应该与结构体的声明分开,如果在头文件声明变量,应该使用extern。

(8)结构体的定义要避免名字空间冲突,需要加上特有的前缀,比如dpdk是 rte_ 。

5、使用linux的queue macro会比自己实现的list rolling要好。

 #include <sys/queue.h>
struct foo {
LIST_ENTRY(foo) link; /* Use queue macros for foo lists. */
struct mumble amumble; /* Comment for mumble. */
int bar; /* Try to align the comments. */
struct verylongtypename *baz; /* Won't fit with other members */
};
LIST_HEAD(, foo) foohead; /* Head of global foo list. */

6、typedef的使用

避免使用typedef来声明结构体类型。

如下声明

 struct my_struct_type {
/* ... */
};
struct my_struct_type my_var;

比下面的好:

typedef struct my_struct_type {
/* ... */
} my_struct_type;
my_struct_type my_var

(1)typedef的问题是它会不恰当的隐藏原有的结构体类型。比如,你不知道它define的是结构体自身还是结构体的指针(有人可能会说通过类型+前缀/后缀来区分,众口难调,我也不喜欢那种如 int_ptr 之类的写法)

(2)typedef只能声明一次,而结构体可以通过不完整的形式声明多次,比如 struct my_struct_type;

(3)要使用typedef的类型必须包含它所在的头文件,这个可能造成名词空间污染。

(4)不要使用define来替代typedef,会引起更多的问题,比如  #define pint  int * 就会出现连续的变量声明问题。

(5)推荐使用typedef来声明函数指针,可以提高代码可读性

 /**
* Definition of a remote launch function.
*/
typedef int (lcore_function_t)(void *);
/* launch a function of lcore_function_t type */
int rte_eal_remote_launch(lcore_function_t *f, void *arg, unsigned slave_id);

最新文章

  1. 【JVM】JVM系列之垃圾回收(二)
  2. 线程,join合并线程
  3. centos重启不能自动联网的解决方法
  4. python(3)-内置函数
  5. 【Zookeeper学习】Apache Zookeeper项目简介
  6. linux内核——1.概述
  7. Hibernate框架注解
  8. python datetime模块详解
  9. elasticsearch以及head插件在centos7上的安装与配置教程
  10. CRC-16的原理和实现
  11. sql基础笔记备忘
  12. ML: 聚类算法-概论
  13. ext.js打印出提示弹窗(鼓捣了两天终于尼玛出来了)
  14. centos配置备忘(apache\php\mysql)
  15. 大数据学习--day17(Map--HashMap--TreeMap、红黑树)
  16. 【移动支付】.NET支付宝App支付接入
  17. python itertools模块练习
  18. CodeForces 805E Ice cream coloring
  19. Struts2的简单的文件上传
  20. BZOJ3141 Hnoi2013 游走 【概率DP】【高斯消元】*

热门文章

  1. ThinkPHP 更新数据 save方法
  2. 刚学不久的python,自己稍微加工了一点,影响不大,因为博主很懒,所以格式什么的,就没有太在意了!
  3. lambda表达式的使用
  4. java基础 序列化反序列化流 实现Serializable 接口 自动装载序列号到对象文本文件如修改不能反序列化对象文本,除非自定义long型常量 打印流
  5. 关于Vue 兄弟组件通信
  6. 本地预览的vue项目,在githubpage静态展示
  7. selenium webdriver 移动到某个位置,滚动到某个位置
  8. IDEA搭建SSM出现的一些错误
  9. gzip,bzip2,xz压缩工具
  10. vue笔记v-if