Linux C语言的编程规范_第1页
Linux C语言的编程规范_第2页
Linux C语言的编程规范_第3页
Linux C语言的编程规范_第4页
Linux C语言的编程规范_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第第页LinuxC语言的编程规范

(Linux)有独特的(编程)风格,在内核源代码目录Documentation/CodingStyle,详细描述代码风格。

建议大家可以去看一下,老外写技术文档还是很有意思的,上来就狂喷,“你不这样写就会完蛋,异教徒才不这样写……”,没有国内那么刻板,多阅读英语文档对技术增长很有帮助。

1.命名规范

在一般编程中,习惯以如下方式命名宏、变量和函数:

#define(PI)3.1415926/*用大写字母代表宏*/intminValue,maxValue;/*变量:第一个单词全小写,其后单词的第一个字母大写*/voidSendData(void);/*函数:所有单词第一个字母都大写*/这种通过单词之间通过首字母大写来区分的方式非常流行。通过第1个单词的首字母是否大写可以区分名称属于变量还是属于函数,而看到整串的大写字母可以断定为宏。

许多领域的程序开发都遵照此习惯。

但是Linux不以这种习惯命名,对于上面的一段程序,在Linux中它会被命名为:

#definePI3.1415926intmin_value,max_value;voidsend_data(void);在上述命名方式中,宏还是一样用大写,但变量和函数名,不按照Windows所采用的用首字母大写来区分单词,而是采用下划线。而且Linux下命名,全局变量命名最好用长的准确的描述,局部变量最好简短,甚至直接用tmp,i之类的。

其实两种命名方式都行,写Liunx下的程序时,与Linux社区代码风格一致更好,但你用第一种我觉得也无伤大雅。

2.缩进

缩进统一使用"TAB",而不是空格括号。

另外提一句:在Linux下,"TAB"代表8个字符,而不是4个,Linux代码风格认为8个字符更能体现层次结构。文档里喷"TAB"为4字符的是异教徒,对于8字符在多层次时,代码太偏右的问题,文档又喷层次超过三层,你的代码就会完蛋,哈哈哈。

为了减少层次,在switch/case语句方面,Linux建议switch和case对齐,例如:

switch(suffix){case'G':case'g':mem3.Linux中代码括号“{”和“}”的使用原则

1)对于结构体、if/f(or)/while/switch语句,“{”不另起一行,例如:

structvar_data{intlen;chardata[0];};if(a==b){a=c;d=a;}for(i=0;i2)如果if、for循环后只有1行,不要加“{”和“}”,例如:

for(i=0;i应该改为:

for(i=0;iif和else混用的情况下,else语句不另起一行,例如:if(x==y){...}elseif(x>y){...}else{...}4)对于函数,“{”另起一行,例如:

int(ad)d(inta,intb)[returna+b;}4.空格的使用

1)关键字后加空格

在这些关键字后面加空格:

if,switch,case,for,do,while

但是这些不加:

sizeof,typeof,alignof,attribu(te)

例如:

s=sizeof(structfile);2)括号内,紧挨着括号不加空格

错误示范:

s=sizeof(structfile);3)对于指针,”*“号挨着名字而不是类型

例如:

char*linux_banner;unsignedlonglongmempa(rs)e(char*ptr,char**retptr);char*match_strdup((sub)string_t*s);4)操作符两侧加空格

以下二元或三元操作符两侧要加空格:

=+-*/%|"class="hljstypescriptvditor-linenumber">intsystem_is_up(void){returnsystem_state==SYSTEM_RUNNING;}EXPORT_SYMBOL(system_is_up);6.goto语句的使用

用不用goto一直是一个著名的争议(话题),Linux内核源代码中对goto的应用非常广泛,但是一般只限于错误处理中,其结构如:

if(register_a()!=0)gotoerr;if(register_b()!=0)gotoerrl;if(register_c()!=0)gotoerr2;if(register_d()!=0)gotoerr3;err3:unregister_c();err2:unregister_b();errl:unregister_a();err:returnret;这种将goto用于错误处理的用法实在是简单而高效,只需保证在错误处理时注销、资源释放等,与正常的注册、资源申请顺序相反。

7.解释

Linux风格的解释是c89"/…/”风格。不要使用c99风格的“//…”解释。

长(多行)解释的首选样式是:

/**Thisisthepreferredstyleformulti-line*commentsintheLinuxkernelsourcecode.*Pleaseuseitconsistently.**Description:Acolumnofasterisksontheleftside,*withbeginningandendingalmost-blanklines.*/8.do{}while(0)语句

在Linux内核中,经常会看到do{}while(0)这样的语句。

许多人开始都会疑惑,认为dowhile(0)毫无意义,因为它只会执行一次,加不加do{}while(0)效果是完全一样的,其实do{}while(0)的用法主要用于宏定义中。

这里用一个简单的宏来演示:

#defineSAFE_FREE(p)do{free(p);p=NULL;}while(0)假设这里去掉do...while(0),即定义SAFE_DELETE为:

#defineSAFEFREE(p)free(p);p=NULL;那么以下代码:

if(NULL!=p)SAFE_DELETE(p)else.../*dosomething*/会被展开为:

if(NULL!=P)free(p);p=NULL;else.../*dosomething*/展开的代码中存在两个问题:

1)因为if分支后有两个语句,导致else分支没有对应的if,编译失败。

2)假设没有else分支,则SAFE_FREE中的第二个语句无论if测试是否通过,都会执行。

的确,将SAFE_FREE的定义加上{}就可以解决上述问题了,即:

#defineSAFE_FREE(p){free(p);p=NULL;}这样,代码:

if(NULL!=p)SAFE_DELETE(p)else.../*dosomething*/会被展开为:

if(NULL!=p){free(p);P=NULL;}else.../*dosomething*/但是,在C程序中,在每个语句后面加分号是一种约定俗成的习惯,那么,如下代码:

if(NULL!=p)SAFE_DELETE(p);else/*dosomething*/将被扩展为:

if(NULL!=p){free(p);p=NULL;};else.../*dosomething*/这样else分支就又没有对应的if了,编译将无法通过。

假设用了do{}while(0)语句,情况就不一样了,同样的代码会被展开为:

if(NULL!=p)do{free(p);p=NULL;}while(0);else

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论