读Defective C++随笔

不尽知用兵之害者,则不能尽知用兵之利也 ——《孙子兵法》

1.为什么API多用C而不是C++
以前就一直很奇怪,为什么API大都用C的方式提供,即使有C++的接口也只是把C的函数又包一层。既然大家都在用C++的编译器,为什么不直接提供C++的API?当初曾经做过一些编译C++DLL的尝试,印象中只是很麻烦,感觉像是编译器支持不好。其实,最核心的原因在于类的私有成员必须出现在头文件里。每当修改实现时,如果修改了私有成员,那么所有使用该DLL的模块都必须重新编译。这意味着无法独立更新C++ API的DLL。而且API库的使用者必须使用和该API库相同的编译器编译,或者被专门设计成能兼容其DLL的编译器(如以前Borland C++的MFC兼容模式)。所以,API大多要么用C,要么用COM式的纯接口。

2.为什么C++程序大多不使用异常
由于C++加入异常功能较晚,绝大大多数的程序采用了C的返回错误码的方式。这些代码不是异常安全的代码,因为它们不能保证在抛出异常时正确释放内存等资源。异常抛出时会跳转到最近的catch语句,后续的资源释放代码将不会执行。要保证异常安全,所有的堆分配对象指针必须使用smart_ptr或shared_ptr等智能指针对象包装,或者用扩展的try-finally语句显示控制释放。而程序员大多不愿引入更多的麻烦,干脆不用异常。但这也带来一些问题,构造函数和重载运算符函数无法返回错误码,所以只能要求它们保证成功。所以便有了构造函数不要做任何资源分配的训诫。不过,即使使用异常,也不能完全解决构造函数运行出错的问题,因为C++规定,构造函数失败,析构函数不会执行。就是说在构造函数抛出异常前分配的资源将无法释放。

http://blog.csdn.net/nightmare/article/details/2296750

为什么API多用C而不是C++,为什么C++程序大多不使用异常的更多相关文章

  1. Web API 2 入门——使用ASP.NET Web API和Angular.js构建单页应用程序(SPA)(谷歌翻译)

    在这篇文章中 概观 演习 概要 由网络营 下载网络营训练包 在传统的Web应用程序中,客户机(浏览器)通过请求页面启动与服务器的通信.然后,服务器处理请求,并将页面的HTML发送给客户端.在与页面的后 ...

  2. 【ASP.NET Web API教程】3.3 通过WPF应用程序调用Web API(C#)

    原文:[ASP.NET Web API教程]3.3 通过WPF应用程序调用Web API(C#) 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本博客文章,请先看前面的 ...

  3. 微信小程序通过api接口将json数据展现到小程序示例

    这篇文章主要介绍了微信小程序通过api接口将json数据展现到小程序示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧实现知乎客户端的一个重要知识前提就是,要知道怎么通过 ...

  4. Web Api试图加载格式不正确的程序,解决方法

    Web Api试图加载格式不正确的程序,错误如下: 问题原因: 出现上述问题的原因是,所加载的程序集中有32位的,也有64位的,IIS 7 程序池 在Windows下.Net FrameWork是64 ...

  5. 如何使用OLAMI自然语言理解开放平台API制作自己的智能对话助手小程序

    我们经常在电影中看到机器和人对答如流,随着越来越多自然语言开放平台的出现,IT爱好者制作一个自己的APP或者小玩具等逐渐可以变为现实. 自然语言对话即你的APP或者你制作的工具.机器人等能够对用户输入 ...

  6. Google Maps Android API v2 (3)- 地图添加到Android应用程序

    添加地图的基本步骤是: (一旦)按照以下步骤[入门] [开始],获得API,获取密钥所需的属性,并添加到您的Android清单. 添加一个碎片对象 要处理地图的活动.做到这一点最简单的方法是增加一个  ...

  7. 微信小程序通过api接口将json数据展现到小程序上

    实现知乎客户端的一个重要知识前提就是,要知道怎么通过知乎新闻的接口,来把数据展示到微信小程序端上. 那么我们这一就先学习一下,如何将接口获取到的数据展示到微信小程序上. 1.用到的知识点 <1& ...

  8. 开源libusb驱动的libwdi驱动安装API库和zadig.exe安装UI应用程序的编译和调试

    一.目的 二.编译环境 系统:Win7 ~ Win10 编译工具:Visual Studio 2008 或 Visual Studio 2010 或Visual Studio 2015 libwdi编 ...

  9. Windows API编程(一)完整的示范程序

    ## #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);//回调函数; int APIEN ...

随机推荐

  1. JS----checked----checked选中和未选中的获取

    , allValue.length - 1); allValue = allValue.replace(/[ ]/g, ""); var checkedIds = allValue ...

  2. 【a603】加工生产调度

    Time Limit: 1 second Memory Limit: 32 MB [问题描述] 某工厂收到了n个产品的订单,这n个产品分别在A.B两个车间加工,并且必须先在A车间加工后才可以到B车间加 ...

  3. hdu1693插头dp(多回路)

    题意:在n*m的矩阵中,有些格子有树,没有树的格子不能到达,找一条或多条回路,吃全然部的树,求有多少中方法. 这题是插头dp,刚刚学习,不是非常熟悉,研究了好几天才明确插头dp的方法,他们老是讲一些什 ...

  4. navigator 页面链接

    页面链接. 属性名 类型 默认值 说明 url String   应用内的跳转链接 redirect Boolean false 是否关闭当前页面 hover-class String navigat ...

  5. FrameLayout帧布局

    一.FrameLayout(帧布局)重点: FrameLayout(帧布局)可以说是五大布局中最为简单的一个布局,这个布局会默认把控件放在屏幕上的左上角的区域,后续添加的控件会覆盖前一个,如果控件的大 ...

  6. Android小游戏:功夫蛇 团队开发经验总结

    前言 曾经没有代码管理的习惯,不用回版本控制工具.这种陋习虽然让原来千穿百孔的代码远离了实现,但这种逃避未必就是一件好事吧;). 于是从博客中挖出了原来的文章,并千辛万苦找到了最早的代码贴出来. 这篇 ...

  7. Android客户端后台发送邮件(JMail)

    今天在做项目的时候要处理用户注册问题,里面有个邮箱验证,网上找了一下果然有人做过,但是我拿过来都运行不起来,或者是发送不了邮件.后来我对这个浅浅的研究了一下,贴出来和大家共享. Activity pa ...

  8. 数学类网站、代码(Matlab & Python & R)

    0. math & code COME ON CODE ON | A blog about programming and more programming. 1. 中文 统计学Computa ...

  9. VSCode 小鸡汤 第01期 - REST Client 简单好用的接口测试辅助工具

    介绍 今天给大家介绍一个后端开发辅助的好工具 -- REST Client,插件如其名这就是一个 REST 的客户端插件,把我们的 VSCode 转化为一个 REST 接口测试的利器 我们一般都会用 ...

  10. python下载图片(2)

    #-*- coding: UTF-8 -*- import urllib2, re,datetime,time, os,sys from PIL import Image, ImageDraw, Im ...