前言:
眼前姐妹们对“c语言goto用法”可能比较看重,咱们都需要分析一些“c语言goto用法”的相关文章。那么小编在网络上收集了一些有关“c语言goto用法””的相关资讯,希望你们能喜欢,各位老铁们一起来学习一下吧!长期以来,C语言中的goto语句一直是被人忽视的存在,我们被许多文字教导尽量不要使用goto语句。滥用goto语句确实会导致程序结构混乱从而使程序难以理解,难以查错。但在程序错误处理中使用goto语句却可以使程序更加简洁,代码结构更加清晰。在linux源码中就有大量的错误处理代码块中使用了goto语句。“倒影式错误处理机制”就是在linux驱动编程中经常用到的一个错误处理技巧,尤其是在涉及资源释放的错误处理情况下十分好用。
下面以某Linux驱动代码中的片段为例介绍“倒影式错误处理机制”:
int do_create_sysfs_files(void){ struct device_driver *sysfs = &st_template.gendrv; int err; /*步骤1*/ err = driver_create_file(sysfs, &driver_attr_try_direct_io); if (err) return err; //步骤1错误处理。第一步出错,没有资源需要释放,直接返回。 /*步骤2*/ err = driver_create_file(sysfs, &driver_attr_fixed_buffer_size); if (err) goto err_try_direct_io; /*步骤3*/ err = driver_create_file(sysfs, &driver_attr_max_sg_segs); if (err) goto err_attr_fixed_buf; /*步骤4*/ err = driver_create_file(sysfs, &driver_attr_version); if (err) goto err_attr_max_sg; return 0; /*步骤4错误处理*/err_attr_max_sg: driver_remove_file(sysfs, &driver_attr_max_sg_segs); /*骤3错误处理*/err_attr_fixed_buf: driver_remove_file(sysfs, &driver_attr_fixed_buffer_size); /*骤2错误处理*/err_try_direct_io: driver_remove_file(sysfs, &driver_attr_try_direct_io); return err;}
上述代码中,代码流程按照 步骤1->步骤2->步骤3->步骤4 执行。而错误处理代码的书写顺序刚好相反,因而称为倒影式错误处理。
使用倒影式错误处理机制,可以避免在代码的正常执行流程中在if-else中写入过多且重复的错误处理代码。如果不使用倒影式错误处理机制,如果在步骤2中出现错误,则需要步骤2中的if (err)中释放步骤1成功申请的资源。同理,如果在步骤3中出现错误,则需要在步骤3中的if (err)中释放步骤1和步骤2申请的资源,此时,释放步骤1资源的代码就重复了,主体流程代码也变得不简洁,随着主流程步骤增加,这会变得更加明显。而倒影式错误处理机制是将错误处理代码集中统一书写到函数末尾,代码清晰,简洁。
以上述代码为例,假设步骤4出错,程序通过goto语句跳转到err_attr_max_sg:所指示的位置,由于goto语句所处的代码块实际上是个顺序结构,所以代码在执行完步骤4错误处理后会顺序地执行步骤3和步骤2的错误处理。整体来看代码非常清晰,每一个步骤都有对应的一个错误处理。