翻译《The Old New Thing》 - BOOL vs. VARIANT_BOOL vs. BOOLEAN vs. bool

news2024/11/25 2:47:20

BOOL vs. VARIANT_BOOL vs. BOOLEAN vs. bool - The Old New Thing (microsoft.com)

 

Raymond Chen  2004年12月22日


BOOL、VARIANT_BOOL、BOOLEAN 和 bool 的比较 

简要

文章讨论了在编程中表示布尔值的几种不同方式,以及它们的起源和应用场景。

正文

        为何会有如此多种表达相同概念的方式?


        原因在于,每一种都是在不同时期由不同的人为了解决不同的问题而创造出来的。

        `BOOL` 是最早期的类型。它的定义非常直接:

typedef int BOOL;

        C 语言将“int”作为布尔类型,而 Windows 1.0 正是在 C 语言作为系统编程的主流语言时开发的。

        随后出现了 `BOOLEAN` 类型。

typedef BYTE BOOLEAN;

        这个类型是由 OS/2 NT 团队引入的,当时他们决定从零开始开发一个新的操作系统。在 Win32 中,你仍然可以在一些原始 NT 设计的残留部分中看到它的身影,例如安全子系统和驱动程序交互。

        再来看看 `VARIANT_BOOL`。

typedef short VARIANT_BOOL;
#define VARIANT_TRUE ((VARIANT_BOOL)-1)
#define VARIANT_FALSE ((VARIANT_BOOL)0)

        这是由 Visual Basic 团队设计的。在 Basic 语言中,使用 `-1` 来表示“真”(true),而 `0` 表示“假”(false)。`VARIANT_BOOL` 正是为了保持这种习惯而设计的。

        常见误区

        在处理类型为 `VT_BOOL` 的 `VARIANT` 对象时,如果你想要设置一个布尔值,应该使用 `VARIANT_TRUE`。许多人错误地使用了 `TRUE` 或 `true`,这些并不等同于 `VARIANT_TRUE`。如果你混淆了它们,可能会在使用脚本语言时遇到问题。(出于对称性,你也应该使用 `VARIANT_FALSE` 而不是 `FALSE` 或 `false`。不过,幸运的是,三者在数值上是相同的,因此在处理“假”值时的错误并不会带来严重后果。)

        最新出现的是 `bool` 类型,它是 C++ 中的一个数据类型,取值为 `true` 或 `false`。在 Win32 开发中,你很少(或者说几乎不会)看到这个类型,因为 Win32 努力保持与 C 语言的兼容性。

注意,C 兼容并不意味着对 C 语言友好。尽管你可以使用 C 语言进行 COM 编程,但那并不是一种愉快的体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1634688.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32学习和实践笔记(22):PWM的介绍以及在STM32中的实现原理

PWM是 Pulse Width Modulation 的缩写,中文意思就是脉冲宽度调制,简称脉宽调制。它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,其控制简单、灵活和动态响应好等优点而成为电力电子技术最广泛应用的控制方式&#xff…

Java从菜鸟到高手①

目录 1.数据类型 2.定义变量 2.1.编码方式 2.2.布尔型变量boolean 2.3.隐式类型转化和强制类型转化 2.4类型提升 3.字符串类型 4.运算符 4.1.取余 4.2. ,- 4.3逻辑运算&& || ! 4.4.位运算 4.5.条件运算符 1.数据类型 Java中&#…

特征融合篇 | YOLOv8 引入动态上采样模块 | 超过了其他上采样器

本改进已集成到YOLOv8-Magic 框架 论文名称:《Learning to Upsample by Learning to Sample》 论文地址:https://arxiv.org/abs/2308.15085 代码地址:https://github.com/tiny-smart/dysample 我们提出了 DySample,一种超轻量级且有效的动态上采样器。尽管最近基于内核的…

解决Linux CentOS 7安装了vim编辑器却vim编辑器不起作用、无任何反应

文章目录 前言一、解决vim不起作用(卸载重新安装)1.重新安装vim2.测试vim是否能正常使用 二、解决vim: error while loading shared libraries: /lib64/libgpm.so.2: file too short报错三、解决vim编辑器不能使用方向键和退格键问题 remove vim-common …

3分钟搭建专属于你的ChatGPT

本文首发于公众号 极客枫哥 ,日更分享各种好玩的软件、编程知识和个人成长故事 我是枫哥,搭建自己的 ChatGPT 是一件非常有意思的事情,你不仅可以学习到如何搭建的过程也可以将它扩展成一个收费版的 AI 网站,提供给其他人使用&…

Burp自定义插件实现请求拦截

在安全测试时,经常需要对请求进行拦截以及配置管理,以便过滤域名或路径的请求。例如:被测对象会不断收集信息(例如IP地址、设备信息)通过HTTP传给服务端。本文将介绍如何使用Burp Suite的扩展插件,通过开发…

人工 VS AGV无人搬运机器人,AGV赋能中国智能制造

agv 机器人作为智能制造的重要抓手,正在渗透到各个传统行业,成为我国制造业转型升级的焦点。未来,智能AGV将不仅仅是简单的把货物搬运到指定的位置,而是要把5G技术、大数据、物联网、云计算等贯穿于产品的设计中,让智能…

ElasticSearch总结1

目录 一、ElasticSearch介绍: 举例一: 举例二: 举例三: 二、ELK技术栈 三、Elasticsearch 的基本概念: 四、正向索引和倒排索引: 正向索引: 倒排索引: 五、Mysql和Elastics…

【设计模式】简单工厂模式(Simple Factory Pattern)

工厂模式(Factory Pattern) 用于创建不同类型的奖品对象。您可以创建一个奖品工厂,根据配置的类型来实例化相应的奖品对象。 public interface Prize {void award(); }public class MoneyPrize implements Prize {Overridepublic void awar…

国内首个图计算平台团体标准发布,创邻科技参与编撰

2024年,由中国通信标准协会批准的团体标准《大数据 图计算平台技术要求与测试方法》(编号:T/CCSA 470—2023)(下称:标准)正式实施。该标准于1月4日在全国团体标准信息平台(https://w…

贝叶斯推理导论:如何在‘任何试验之前绝对一无所知’的情况下计算概率

从左至右依次为托马斯贝叶斯、皮埃尔-西蒙拉普拉斯和哈罗德杰弗里斯——逆概率(即现在所说的客观贝叶斯分析)发展中的关键人物。[24] 历史背景 1654年,帕斯卡尔和费马共同解决了“点问题”, 创造了早期的直接概率推理理论。三十年后,雅各布伯努利将概率…

超详细的Vue脚手架

文章目录 Node.js介绍安装快速入门控制台输出使用函数模块化编程 npm包管理器介绍命令初始化命令本地安装(了解)全局安装(掌握)批量下载淘宝npm镜像(建议使用) Webpack介绍安装快速入门方式一:webpack原始方式方式二:基于NPM方式 webpack-dev-server 开发…

黑马点评(二)--商户查询缓存

目录 1.缓存更新策略1.1内存淘汰1.2超时剔除1.3主动更新 2.实现缓存和数据库的双写一致2.1Controller2.2Service2.3思路讲解 3.解决缓存穿透问题3.1出现原因3.2解决方案3.3代码实现 4.解决缓存雪崩问题4.1出现原因4.2解决方案4.3代码实现 5.解决缓存击穿问题5.1出现原因5.2解决…

Spring Cloud Security Oauth2 授权码模式

授权码存取—内存方式 获取Code Bisic认证 WebSecurityConfig 配置 Basic Auth认证 登录 数据库建表 授权码存储方式-数据库 Beanpublic AuthorizationCodeServices authorizationCodeServices() {return new JdbcAuthorizationCodeServices(dataSource);}问题 OAuth2 授…

rocketmq dashboard控制台中topic状态无法展示

现象 在使用rocketmq控制台查看topic状态和订阅状态时,出现错误和没有信息的情况。 原因 rocketmq控制台版本问题,最新版本为1.0.1,支持rocketmq5版本,如果使用rocketmq4版本的服务无法兼容对应的数据。同理1.0.0版本也无法兼容ro…

C++ 抽象机制

抽象机制 1. 虚函数 使用关键字virtual 声明的函数,意思是可能随后在其派生类中重新定义。 纯虚函数 在声明的末尾使用0 的函数,说明是纯虚函数。 抽象类 含有纯虚函数多的类称为抽象类(abstract class). 多态类型 如果一个类负责为其他一些类提供接…

C语言例题31:在屏幕上显示一个菱形

题目要求&#xff1a;在屏幕上显示一个菱形 #include <stdio.h>void main() {int i, j;int x;printf("输入菱形行数(3以上的奇数&#xff09;&#xff1a;");scanf("%d", &x);//显示菱形上面的大三角形for (i 1; i < (x 1) / 2; i) {for (…

重磅合作:OpenAI将金融时报的数据引入ChatGPT|TodayAI

在今天的重磅公告中&#xff0c;金融时报&#xff08;FT&#xff09;与OpenAI宣布建立了一项战略合作伙伴关系和许可协议。这一举措标志着金融时报将其卓越新闻内容引入ChatGPT平台&#xff0c;同时也为FT读者带来前所未有的AI新体验。 这项合作不仅让ChatGPT用户在查询时能够…

Oracle 表分区

1.概述 分区表就是将表在物理存储层面分成多个小的片段&#xff0c;这些片段即称为分区&#xff0c;每个分区保存表的一部分数据&#xff0c;表的分区对上层应用是完全透明的&#xff0c;从应用的角度来看&#xff0c;表在逻辑上依然是一个整体。 目的&#xff1a;提高大表的查…

redis中缓存穿透问题

缓存穿透 缓存穿透问题&#xff1a; 一般请求来到后端&#xff0c;都是先从缓存中查找数据&#xff0c;如果缓存中找不到&#xff0c;才会去数据库中查询数据。 而缓存穿透就是基于这一点&#xff0c;不断发送请求查询不存在的数据&#xff0c;从而使数据库压力过大&#xff…