C99柔性数组
在讲述柔性数组(Flexible Array)之前,首先要介绍一下不完整类型 (Incomplete Type)。不完全类型是暂时没有完全定义好的类型,缺乏足够的信息(例如长度、类型)去描述一个完整的类型。在C/C++中不完全类型有三种不同形式:void、未指定长度的数组以及具有非指定内容的结构和类。
在讲述柔性数组(Flexible Array)之前,首先要介绍一下不完整类型 (Incomplete Type)。不完全类型是暂时没有完全定义好的类型,缺乏足够的信息(例如长度、类型)去描述一个完整的类型。在C/C++中不完全类型有三种不同形式:void、未指定长度的数组以及具有非指定内容的结构和类。
打开任何一个数字证书售卖网站都可以看到它们通常将数字证书分为两个大类:SSL证书和数字签名证书。
SSL证书的主要作用是对网站进行身份验证和传输数据加密;
数字签名主要用于验证信息的真实性和完整性,根据使用场景的不同大致分为如下几类:
在前面的《玩转 Qt 2D 绘图》系列文章中,已经介绍了 2D 绘图中常用的知识,本文主要通过一个汽车仪表盘的实例来综合应用前面所介绍知识点,并且还介绍了一些 Qt 绘图的常用技巧。
相关文章:
在日常生活中,我们不仅需要记忆6位数字的银行卡密码,还需要记忆各式各样网站和应用的账号密码,可能我们自己也不记得曾经注册过多少个账号。账号和密码如此繁多,管理这些账号和密码,也是一个让人头疼的问题。
最原始的方法是将密码写纸上,放在一个安全的地方,但纸张存在丢失、损坏的风险,而且不方便存取。
改进版则是将纸张电子化,如 Excel,并辅以云盘实现多端同步,这样虽然存取便利性上有一定的改善,但安全性却降低了很多,如果云盘没有历史版本功能,在编辑时稍有失误,可能导致密码全部丢失,另外如果云盘密码泄露、电脑中毒或系统损坏,也可能导致密码泄露或丢失。如果某一天云盘软件突然倒闭了,该怎么办呢?
目前已经有很多账号密码管理软件,来帮助人们管理账号和密码,如 1Password、KeePass 等,但它们也或多或少存在一些缺陷:
当我们在代码中写下一行 throw 语句时,我们就此埋下了一个祸根,从此以后,在该函数调用链中,必须至少有一个调用者需要提供相应的异常捕获,否则一旦异常被抛出,程序就会异常终止。
例如,函数 f() 调用 g(),而 g() 又调用 h(),并且 h() 抛出一个异常,则 g() 和 f()中必须有一个提供了相应的异常捕获,否则程序会异常终止。
由于异常会使代码的执行流程从任意地方跳出,因此我们还需要付出大量的精力来编写正确的异常安全代码,例如使用 RAII(资源获取即初始化)来保证资源正确释放。
如下面的示例,虽然我们在函数 f() 中捕获了异常,避免了程序的异常终止,但异常却中断了函数 g() 的正常执行流程,导致对象 m 没有被正确释放,从而出现了资源泄露。这种情况可能还会变相地增加了程序的调试难度。
本文了转载和收集了一些常用的 Unicode 表情符号,方便查阅。完整的 Unicode 表情符号可以查询下面的网站:
《红楼梦》第五十回中,一夜大雪后,贾府大观园的姐妹们一起作诗,众姐妹要王熙凤为即景联诗起个头。王熙凤虽只识得几个字,倒也不扭捏,笑道:“我想下雪必刮北风。昨夜听见了一夜的北风,我有了一句,就是‘一夜北风紧’,可使得?”众人听了,都相视笑道:“这句虽粗,不见底下的,这正是会作诗的起法。不但好,而且留了多少地步与后人”。
在 Qt 2D 世界中,图形基本都由点、线、矩形、多边形、椭圆、圆、折线、曲线、文本、贴图等基本元素辅以着色而构成,而且 QPainter 类已经提供了这些元素的绘制方法,花点时间掌握这些方法,也就掌握了 Qt 2D 图形控件的制作,余下的就是勤学多练、孰能生巧了。
软件是对现实世界的抽象,在设计软件接口时通常也会参考现实世界来进行设计。
在现实世界中,画家使用画笔、画刷这些工具在宣纸上作画,而在 Qt 中,画家是 QPainter 对象(画家的大脑则是 QPaintEngine),纸张可以是 QPaintDevice 的任何子类对象,如 QWidget、QImage、QPixmap、QGLPixelBuffer 等;在 QPainter 选好纸张后,就可以使用画笔来勾勒物体的轮廓了,Qt 中的画笔是 QPen 对象;画完轮廓后,可能还需要使用画刷来填充轮廓,Qt 中的画刷是 QBrush 对象。