您现在的位置:计算机技术学习网 > 技术中心 > 编程开发 > C >

[编程好习惯] 恰当使用goto语句

来源:李云 责任编辑:栏目编辑 发表时间:2013-07-01 09:48 点击:
    goto语句在C/C++语言中可谓是“臭名昭著”,乃至有的书(或公司的编程规范)提出禁用goto语句的说法。其结果就是,造成有的程序员一看到goto语句在某程序中被使用,就本能地认为这个程序写得很“垃圾”。此外,也使得有些程序员因为使用了goto语句而觉得自己很不专业。其实,凡事都不能太偏激,goto语句运用得好能大大地简化程序,以及提高程序的可读性和可维护性。在开始示例其好处之前,先用一些统计数据来说明goto语句并没有因为“臭名昭著”而被抛弃,这些统计数据可能并不是百分之百的精确,但很具有说服力。对于操作系统,Linux-2.6.21内核使用了20,333个goto语句,VxWorks-6.2则使用了9142个,最后941个goto语句被运用到了rtems-4.9.2中;另外,glibc-2.9库使用了1750个goto语句。所有这些统计数据都表明,goto语言并没有想象的那样可怕而招到禁用,其关键在于 —— 恰当地运用它。

    图1是一个没有采用goto语句编写的函数,其中存在多处出错处理的代码,比如113~115行、120~122行和126~129行。采用这种分布式的出错处理,很容易出现遗漏释放前面已经分配的资源,从而造成资源泄漏问题。如果采用goto语句,则能取得更好的效果。
example.c
00097: int queue_init (queue_t ** _pp_queue, int _size)
00098: {
00099:     pthread_mutexattr_t attr;
00100:     queue_t *queue;
00101:
00102:        queue = (queue_t *) malloc(sizeof(queue_t));
00103:        if (0 == queue) {
00104:         return -1;
00105:     }
00106:     *_pp_queue = queue;
00107:
00108:     memset (queue, 0, sizeof (*queue));
00109:     queue->size_ = _size;
00110:
00111:     pthread_mutexattr_init (&attr);
00112:     if (0 != pthread_mutex_init(&queue->mutex_, &attr)) {
00113:         pthread_mutexattr_destroy (&attr);
00114:         free (queue);
00115:         return -1;
00116:     }
00117:
00118:     queue->messages_ = (void **) malloc (queue->size_ * sizeof (void *));
00119:     if (0 == queue->messages_) {
00120:         pthread_mutexattr_destroy (&attr);
00121:         free (queue);
00122:         return -1;
00123:     }
00124:
00125:     if (0 != sem_init(&queue->sem_put_, 0, queue->size_)) {
00126:         free (queue->messages_);
00127:         pthread_mutexattr_destroy (&attr);
00128:         free (queue);
00129:         return -1;
00130:     }
00131:
00132:     pthread_mutexattr_destroy (&attr);
00133:
00134:     return 0;
00135: }
图1
    图2是采用goto语句所编

    相关新闻>>

      发表评论
      请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
      用户名: 验证码:点击我更换图片
      最新评论 更多>>

      推荐热点

      • Glib实例学习(2)双链表
      • C程序员要学C++吗?
      • C++中实现Singleton的正确方法
      • 编程思维训练(一)
      • 【编程好习惯】引入中间变量使程序更易读
      • 在C++中通过模板规避潜在错误
      • 在C++中通过模板去除强制转换
      • 【编程好习惯】减少搜索头文件的目录数
      网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
      Copyright © 2008-2015 计算机技术学习交流网. 版权所有

      豫ICP备11007008号-1