2016-08-03 09:48连伟杰 客户经理

在我的整个职业生涯里我都在使用C++,而且现在C++依然是我做大多数项目时的首选编程语言。自然的,当我从2007年开始做ZeroMQ(ZeroMQ项目主页)时,我选择用C++来实现。主要的原因有以下几点:1. 包含数据结构和算法的库(STL)已经成为这个语言的一部分了。如果用C,我将要么依赖第三方库要么不得不自己手动写一些自1970年来就早已存在的基础算法。2. C++语言本身在编码风格的一致性上起到了一些强制作用。比如,有了隐式的this指针参数,这就不允许通过各种不同的方式将指向对象的指针做转换,而那种做法在C项目中常常见到(通过各种类型转换)。同样的还有可以显式的将成员变量定义为私有的,以及许多其他的语言特性。3. 这个观点基本上是前一个的子集,但值得我在这里显式的指出:用C语言实现虚函数机制比较复杂,而且对于每个类来说会有些许的不同,这使得对代码的理解和维护都会成为痛苦之源。4. 最后一点是:人人都喜欢析构函数,它能在变量离开其作用域时自动得到调用。如今,5年过去了,我想公开承认:用C++作为ZeroMQ的开发语言是一个糟糕的选择,后面我将一一解释为什么我会这么认为。首先,很重要的一点是ZeroMQ是需要长期连续不停运行的一个网络库。它应该永远不会出错,而且永远不能出现未定义的行为。因此,错误处理对于ZeroMQ来说至关重要,错误处理必须是非常明确的而且对错误应该是零容忍的。C++的异常处理机制却无法满足这个要求。C++的异常机制对于确保程序不会失败是非常有效的——只要将主函数包装在try/catch块中,然后你就可以在一个单独的位置处理所有的错误。然而,当你的目标是确保没有未定义行为发生时,噩梦就产生了。C++中引发异常和处理异常是松耦合的,这使得在 C++中避免错误是十分容易的,但却使得保证程序永远不会出现未定义行为变得基本不可能。在C语言中,引发错误和处理错误的部分是紧耦合的,它们在源代码中处于同一个位置。这使得我们在错误发生时能很容易理解到底发生了什么:int rc = fx (); if (rc != 0) handle_error();在C++中,你只是抛出一个异常,到底发生了什么并不能马上得知。int rc = fx(); if (rc != 0) throw std::exception();这里的问题就在于你对于谁处理这个异常,以及在哪里处理这个异常是不得而知的。如果你把异常处理代码也放在同一个函数中,这么做或多或少还有些明智,尽管这么做会牺牲一点可读性。try { … int rc = fx(); if (rc != 0) throw st担稜曹谷丨咐查栓肠兢d::exception(“Error!”); … catch (std::exception &e) { handle_exception(); }但是,考虑一下,如果同一个函数中抛出了两个异常时会发生什么?class exception1 {}; class exception2 {}; try { … if (condition1) throw my_exception1(); … if (condition2) throw my_exception2(); … } catch (my_exception1 &e) { handle_exception1(); } catch (my_exception2 &e) { handle_exception2(); }对比一下相同的C代码:… if (condition1) handle_exception......余下全文>>

c语言中未定义的作用,C语言中未定义行为的iiii相关推荐

  1. c语言中 程序各步作用,C语言学习网总结C语言学习五步曲

    很多人对C语言的第一感觉就是太难了,很难理解这种语言,也不知道该如何来理解,书也看了,视频也看了,但就是没什么太大的作用,那么C语言究竟该如何来学? C语言作为一门计算机语言,想要真正的掌握并使用需要 ...

  2. c语言里的%p的作用,c语言中 %p的含义

    格式控制符"%p"中的p是pointer(指针)的缩写.指针的值是语言实现(编译程序)相关的,但几乎所有实现中,指针的值都是一个表示地址空间中某个存储器单元的整数.printf函数 ...

  3. c语言中初始化的主要作用,C语言初始化——栈的初始化

    栈是一种具有后进先出性质的数据组织方式,也就是说后存放的先取出,先存放的后取出.栈底是第一个进栈的数据所处的位置,栈顶是最后一个进栈的数据所处的位置. 1.满栈与空栈 根据SP指针指向的位置,栈可以分 ...

  4. c语言中各种函数的作用,C语言常用函数用法大全

    C语言是当中广泛的计算机编程语言,是所有计算机编程语言的祖先,其他计算机编程语言包括当前流行的Java语言,都是用C语言实现的,C语言是编程效率高的计算机语言,既能完成上层应用开发,也能完成底层硬件驱 ...

  5. C语言中动态数组的作用,C语言实现动态数组

    前言 在纯C语言编程中,数组的创建必须是固定的大小,因为C语言本身没有提供动态数组这种数据结构,这是一个让习惯了使用高级语言编程的人转做C开发面临的一个很头疼的问题,本篇文章就将介绍如何使用纯C语言编 ...

  6. c语言for表达式1的作用,C语言for语句用法详解

    C语言for语句用法详解 C语言是一门高级计算机编程语言,设计目标是提供一种能以简易的方式编译.处理低级存储器.产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言.下面小编给大家介绍C语言f ...

  7. C语言的注释形式及作用,C语言注释详解(两种注释方式)

    在编写C语言源代码时,应该多使用注释,这样有助于对代码的理解.在C语言中有两种注释方式: 一种是以/*开始.以*/结束的块注释(block comment): 另一种是以//开始.以换行符结束的单行注 ...

  8. c语言中的除号什么作用,c语言中除号用什么表示

    前言继承是OOP设计中的重要概念.在C++语言中,派生类继承基类有三种继承方式:私有继承(private).保护继承(protected)和公有继承(public).一.继承规则继承是C++中的重要特 ...

  9. c语言中循环结构的作用,C语言循环结构知识点

    C语言循环结构知识点 引导语:循环结构可以减少源程序重复书写的工作量,用来描述重复执行某段算法的问题,这是程序设计中最能发挥计算机特长的程序结构.以下是百分网小编分享给大家的C语言循环结构知识点,欢迎 ...

  10. c语言中预处理指令的作用,C语言中常用预处理指令

    转载自 https://blog.csdn.net/farsight2009/article/details/58602886 姓名:张艳博 学号:17021223249 [嵌牛导读]: C语言中常用 ...

最新文章

  1. GPU自动调度卷积层
  2. Google Analytics功能篇 - 如何跟踪邮件打开率与点击率
  3. 自定义PointViewPager依赖库
  4. JavaScript语言基础8
  5. 程序员法律考试(6)-民法(3)
  6. 分布式系统的那些事儿(六) - SOA架构体系
  7. Java之Callable和Runnable
  8. 使用Java 8在地图上流式传输
  9. 漫话:如何给女朋友解释什么是系统可用性? | 技术头条
  10. 解决java.lang.IllegalArgumentException: No converter found for return value of type
  11. 190109每日一句
  12. T 沙龙 2018 年 1 月上海第 10 次线下活动总结
  13. 17. 装箱、拆箱的最小化
  14. Qt实现的局域网通信软件(仿QQ版本)
  15. sql server 2005 32位+64位、企业版+标准版、CD+DVD 下载地址大全【申明:来源于网络】
  16. matlab学习笔记 struct函数
  17. php子孙树,递归 迭代 得到家谱树 子孙树
  18. 【web-ctf】ctf_BUUCTF_web(2)
  19. android 两边圆角,Android自定义View实现带4圆角或者2圆角的效果
  20. WebSphereMQ 报错代码 查询

热门文章

  1. 攻防世界-Web-PHP2
  2. STM32 HAL库 CubeMX教程(四)按键外部中断
  3. GitHub常见标签生成教学,让你的开源库添加几分姿色。
  4. linux关防火墙7.50,PXE自动安装cento7(笔记)
  5. 产品设计体会(7022)TTT实战演练记录
  6. Adobe Acrobat中操作pdf文件被保护,请输入许可口令
  7. Web信息抓取方法与解析受攻击面
  8. 贴花、射线、动画通知——足迹01
  9. 新一代标签页Taber插件教程
  10. 【无标题】2023年中级工程师评审条件