负笈前行--DPDK代码风格
每个公司都会有自己代码风格或者编程规范,都旨在防范编程语言的一些陷阱或者提高代码效率,还有就是保持一致编码风格来提高代码可读性,方便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);
负笈前行--DPDK代码风格的更多相关文章
- Google JavaScript代码风格指南
Google JavaScript代码风格指南 修正版本 2.28 Aaron Whyte Bob Jervis Dan Pupius Eric Arvidsson Fritz Schneider R ...
- Python 代码风格
1 原则 在开始讨论Python社区所采用的具体标准或是由其他人推荐的建议之前,考虑一些总体原则非常重要. 请记住可读性标准的目标是提升可读性.这些规则存在的目的就是为了帮助人读写代码,而不是相反. ...
- .NET 项目代码风格要求
原文:http://kb.cnblogs.com/page/179593/ 项目代码风格要求 PDF版下载:项目代码风格要求V1.0.pdf 代码风格没有正确与否,重要的是整齐划一,这是我拟的一份&l ...
- AngularJS之代码风格36条建议【一】(九)
前言 其实在新学一门知识时,我们应该注意下怎么书写代码更加规范,从开始就注意养成一个良好的习惯无论是对于bug的查找还是走人后别人熟悉代码都是非常好的,利人利己的事情何乐而不为呢,关于AngularJ ...
- Visual Studio Code 使用 ESLint 增强代码风格检查
前言 在团队协作开发中,为了统一代码风格,避免一些低级错误,应该设有团队成员统一遵守的编码规范.很多语言都提供了Lint工具来实现这样的功能,JavaScript也有类似的工具:ESLint.除了可以 ...
- plain framework 1 参考手册 入门指引之 代码风格
代码风格 介绍 介绍 框架自身采用了google的C++风格,作者也鼓励在你的应用中使用此风格,有关此风格你可以查阅相关资料了解.下面是一段plain framework中的代码,以便大家参考: 你可 ...
- 对 JimmyZhang 老师的文章《项目代码风格要求》的一些个人观点
Jimmy Zhang 老师是博客园中我最佩服的人之一,今天看了他的文章<项目代码风格要求>觉得大部分地方我都很认同,工作中也是强迫自己也要按照规范来编程.下面是我的一些个人观点,想贴出来 ...
- python代码风格-PEP8
转载自http://www.douban.com/note/134971609/ Python 的代码风格由 PEP 8 描述.这个文档描述了 Python 编程风格的方方面面.在遵守这个文档的条件下 ...
- Google HTML/CSS代码风格指南(中文版)
原文链接:http://wncbl.cn/posts/c8e10815/ 看一下没什么印象,那就写一遍吧. 背景 本文档定义了HTML/CSS的编写格式和风格规则.它旨在提高合作和代码质量,并使其支持 ...
随机推荐
- (简单) HDU 1698 Just a Hook , 线段树+区间更新。
Description: In the game of DotA, Pudge’s meat hook is actually the most horrible thing for most of ...
- abs函数
absolute 绝对值函数 abs函数是一个取绝对值函数,你得确保ABS()括号里的表达式所计算出的结果是数字,String是字符串的意思,你括号你的数据肯定是字符串了,如果A.B两变量你是这样定义 ...
- JQuery的 jQuery.fn.extend() 和jQuery.extend();
原文链接:http://caibaojian.com/jquery-extend-and-jquery-fn-extend.html jQuery.fn.extend(); jQuery.extend ...
- 集群下Cookie共享,必须要设置machineKey
这个节允许你设置用于加密数据和创建数字签名的服务器特定的密钥.ASP.NET自动使用它来保护表单验证Cookie,你也可以将它用于受保护的视图状态数据.同时,这个密钥还用于验证进程外的会话状态提供程序 ...
- javascript---jquery (1事件)
1.例子说明 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. ...
- JavaScript高级程序设计-13:事件
JavaScript与HTML之间的交互是通过事件实现的. 一.事件流 首先我们要明白事件流的概念.当我们点击一个按钮时,也点击了按钮的容器元素,甚至也点击了整个事件.事件流描述就是从页面中接收事件的 ...
- 获取IIS版本
近日,有一项目要分别获取iis6.0和7.5,然后对进程进行操作~ 研究良久,有以下办法获取iis版本. 代码: DirectoryEntry getEntity = new DirectoryEnt ...
- hibernate-Maven
1.创建Maven 2.创建Maven工程 3.然后一直下一步 4.创建成功后Maven 5.下载jra包 //hibernate <dependencies> <dependenc ...
- Python3基础 闭包 简单示例
镇场诗: 诚听如来语,顿舍世间名与利.愿做地藏徒,广演是经阎浮提. 愿尽吾所学,成就一良心博客.愿诸后来人,重现智慧清净体.-------------------------------------- ...
- Windows7启用超级管理员administrator账户的多种方法
开启win7家庭普通版的超级管理员账户Administrotor WIN7家庭普通版没有"本地用户和组"项,不能通过"用计算机右键-管理"的方法开启超级管理员帐 ...