读书频道 > 网站 > 网页设计 > Linux设备驱动开发详解:基于最新的Linux 4.0内核
3.5.1 Linux编码风格
15-08-30    下载编辑
收藏    我要投稿   
本书首先介绍Linux设备驱动的基础。第1章简要地介绍了设备驱动,并从无操作系统的设备驱动引出了Linux操作系统下的设备驱动,介绍了本书所基于的开发环境。第2章系统地讲解了Linux驱动工程师应该掌握的硬件知识,立即去当当网订购
3.5 Linux下的C编程特点
 
3.5.1 Linux编码风格
 
Linux有独特的编码风格,在内核源代码下存在一个文件Documentation/CodingStyle,进行了比较详细的描述。
 
Linux程序的命名习惯和Windows程序的命名习惯及著名的匈牙利命名法有很大的不同。
 
在Windows程序中,习惯以如下方式命名宏、变量和函数:
 
#def?ine PI 3.1415926 /* 用大写字母代表宏 */
 
int minValue, maxValue; /* 变量:第一个单词全小写,其后单词的第一个字母大写 */
 
void SendData(void); /* 函数:所有单词第一个字母都大写 */
 
这种命名方式在程序员中非常盛行,意思表达清晰且避免了匈牙利法的臃肿,单词之间通过首字母大写来区分。通过第1个单词的首字母是否大写可以区分名称属于变量还是属于函数,而看到整串的大写字母可以断定为宏。实际上,Windows的命名习惯并非仅限于Windows编程,许多领域的程序开发都遵照此习惯。
 
但是Linux不以这种习惯命名,对于上面的一段程序,在Linux中它会被命名为:
 
#def?ine PI 3.1415926 
int min_value, max_value;
void send_data(void); 
 
在上述命名方式中,下划线大行其道,不按照Windows所采用的用首字母大写来区分单词的方式。Linux的命名习惯与Windows命名习惯各有千秋,但是既然本书和本书的读者立足于编写Linux程序,代码风格理应与Linux开发社区保持一致。
 
Linux的代码缩进使用“TAB”。
Linux中代码括号“{”和“}”的使用原则如下。
1)对于结构体、if/for/while/switch语句,“{”不另起一行,例如:
struct var_data {
   int len;
   char data[0];
};

if (a == b) {
     a = c;
     d = a;
}

for (i = 0; i < 10; i++) {
     a = c;
     d = a;
}
2)如果if、for循环后只有1行,不要加“{”和“}”,例如:
for (i = 0; i < 10; i++) {
      a = c;
}
应该改为:
for (i = 0; i < 10; i++) 
      a = c;
3)if和else混用的情况下,else语句不另起一行,例如:
if (x == y) {
    ...
} else if (x > y) {
    ...
} else {
  ...
}
4)对于函数,“{”另起一行,譬如:
int add(int a, int b)
{
     return a + b;
}
在switch/case语句方面,Linux建议switch和case对齐,例如:
switch (suff?ix) {
case 'G':
case 'g':
      mem <<= 30;
      break;
case 'M':
case 'm':
      mem <<= 20;
      break;
case 'K':
case 'k':
      mem <<= 10;
      /* fall through */
default:
      break;
}

 

 
内核下的Documentation/CodingStyle描述了Linux内核对编码风格的要求,内核下的scripts/checkpatch.pl提供了1个检查代码风格的脚本。如果使用scripts/checkpatch.pl检查包含如下代码块的源程序:
 
for (i = 0; i < 10; i++) {
      a = c;
}
 
就会产生“WARNING: braces {} are not necessary for single statement blocks”的警告。
 
另外,请注意代码中空格的应用,譬如“for?(i?=?0; ?i?<?10; ?i++)?{”语句中的“?”都是空格。
 
在工程阶段,一般可以在SCM软件的服务器端使能pre-commit hook,自动检查工程师提交的代码是否符合Linux的编码风格,如果不符合,则自动拦截。git的pre-commit hook可以运行在本地代码仓库中,如Ben Dooks完成的一个版本:
 
#!/bin/sh
#
# pre-commit hook to run check-patch on the output and stop any commits
# that do not pass. Note, only for git-commit, and not for any of the
# other scenarios
#
# Copyright 2010 Ben Dooks, <ben-linux@fluff.org>

if git rev-parse --verify HEAD 2>/dev/null >/dev/null
then
    against=HEAD
else
    # Initial commit: diff against an empty tree object
    against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
f?i

git diff --cached $against -- | ./scripts/checkpatch.pl --no-signoff -

 


点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:1.3 功能
下一篇:1.5 小结
相关文章
图文推荐
JavaScript网页动画设
1.9 响应式
1.8 登陆页式
1.7 主题式
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站