没有找到合适的产品?
联系客服协助选型:023-68661681
提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
原创|其它|编辑:郝浩|2010-02-12 10:27:35.000|阅读 782 次
概述: goto语句在C/C++语言中可谓是“臭名昭著”,乃至有的书(或公司的编程规范)提出禁用goto语句的说法。其结果就是,造成有的程序员一看到goto语句在某程序中被使用,就本能地认为这个程序写得很“垃圾”。
# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>
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语句所编写的另一个版本,与不采用goto语句的版本相比,程序更加的简单,且在出错处理的地方大都使用goto语句跳转到程序的末尾进行处理。goto语句除了可以用在这里所示例的出错处理中,还可以用在其它的程序逻辑中以简化程序并提高阅读性。
example.c 00053: int queue_init (queue_t ** _pp_queue, int _size) 00054: { 00055: pthread_mutexattr_t attr; 00056: queue_t *queue; 00057: 00058: queue = (queue_t *) malloc(sizeof(queue_t)); 00059: if (0 == queue) { 00060: return -1; 00061: } 00062: *_pp_queue = queue; 00063: 00064: memset (queue, 0, sizeof (*queue)); 00065: queue->size_ = _size; 00066: 00067: pthread_mutexattr_init (&attr); 00068: if (0 != pthread_mutex_init(&queue->mutex_, &attr)) { 00069: goto error; 00070: } 00071: 00072: queue->messages_ = (void **) malloc (queue->size_ * sizeof (void *)); 00073: if (0 == queue->messages_) { 00074: goto error; 00075: } 00076: 00077: if (0 != sem_init(&queue->sem_put_, 0, queue->size_)) { 00078: goto error1; 00079: } 00080: 00081: pthread_mutexattr_destroy (&attr); 00082: 00083: return 0; 00084: 00085: error1: 00086: free (queue->messages_); 00087: error: 00088: pthread_mutexattr_destroy (&attr); 00089: free (queue); 00090: return -1; 00091: } |
代码段2
使用goto语句时需要注意以下原则:
1) 不要过份地使用。比如代码段2中的60行就没有采用goto语句跳到程序的最后面,之所以这里不使用goto是为了阅读方便。因为程序此时还没有分配资源,所以直接返回显得更加的直接了当。还有就是,在这个函数中如果存在使用goto语句都意味着出错了且需要释放资源。如果将60行的语句也改为goto就破坏了这个函数中使用goto语句的一致性。
2) 不要让goto语句形成一个环。使用goto语句应形成一条线,从一点跳到另一点。当然,如果goto语句的使用没有破坏可读性,那可以适当的考虑打破这一原则。
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com
文章转载自:网络转载面对“数字中国”建设和中国制造2025战略实施的机遇期,中车信息公司紧跟时代的步伐,以“集约化、专业化、标准化、精益化、一体化、平台化”为工作目标,大力推进信息服务、工业软件等核心产品及业务的发展。在慧都3D解决方案的实施下,清软英泰建成了多模型来源的综合轻量化显示平台、实现文件不失真的百倍压缩比、针对模型中的大模型文件,在展示平台上进行流畅展示,提升工作效率,优化了使用体验。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@evget.com
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢
慧都科技 版权所有 Copyright 2003-
2025 渝ICP备12000582号-13 渝公网安备
50010702500608号