QT C++开发套路之:重定义基础数据类型

news/2025/1/3 5:07:52/

(1)前言

对于C/C++,几乎每个系统都会重定义(typedef)基础数据类型。
(QT在qglobal.h中,MSVS在minwindef.h)。
其目的是为了方便代码的迁移(在各种环境之间)。
另外,也是为了掌控数据类型的容量,不至于溢出了还不知道。

(2)环境

Qt 5.15 LTS,编译工具 MSVS / MinGW,CPU架构 32 / 64 bits。

(3)基础数据类型定义

以下是基础数据类型重定义的片段:

//(1.1) 无符号类型(按简写)
typedef unsigned char       uchar;      //char
typedef unsigned short      ushort;     //short
typedef unsigned int        uint;       //int
typedef unsigned long       ulong;      //long
typedef unsigned long long  ulonglong;  //long long//(1.2) 无符号类型(按所占位数)
typedef uchar       uint8;      //8bits
typedef ushort      uint16;     //16bits
typedef ulong       uint32;     //32bits
typedef ulonglong   uint64;     //64bits//(1.3) 无符号类型(按名称)
typedef uint8       BYTE;
typedef uint16      WORD;
typedef uint32      DWORD;      //Dual-word, 32 bits
typedef uint64      QWORD;      //Quad-word, 64 bits//(2.1) 有符号类型(按简写)
//typedef signed int        int;        //int
typedef signed long long    longlong;   //long long//(2.2) 有符号类型(按所占位数)
typedef signed char     int8;   //8bits
typedef signed short    int16;  //16bits
typedef signed long     int32;  //32bits
typedef longlong        int64;  //64bits

其中可以看出一些迷惑:无处安放的 int 和 万金油 long。
例如:uint32 用的是 ulong 而不是 uint,int32 用的是 long 而不是 int

(3.1)定义的依据

实际上,定义的依据无非有以下几点:

  • C++标准、惯用法(例如:DWORD 只能是32 bits,而不能用64 bits)
  • 主流环境(OS/CPU/编译器,例如:无需考虑 16 bits 环境)
  • 应用考量(宁大勿小防溢出,例如:能用 long 不用 int,能用 int64 不用 int32)

(3.2)定义的验证

以下是在 MSVS/MinGW,32/64 bits,debug/release 模式下运行输出结果:

Size(bits) of uchar/uint8/BYTE =  8
Size(bits) of ushort/uint16/WORD =  16
Size(bits) of unsigned int =  32
Size(bits) of ulong/uint32/DWORD =  32
Size(bits) of ulonglong/uint64/QWORD =  64
Size(bits) of char/int8 =  8
Size(bits) of short/int16 =  16
Size(bits) of signed int =  32
Size(bits) of int =  32
Size(bits) of long/int32 =  32
Size(bits) of longlong/int64 =  64

基本符合预期。

(4)结语

重定义基础数据类型是一个老话题。
但也也暗藏玄机,知其然(WHAT)和知其所以然(WHY)还是很有必要的。
GOOD LUCK!


http://www.ppmy.cn/news/61136.html

相关文章

AIgo C++ 面向ai算法的c++

https://github.com/shouxieai/algorithm-cpp http://aipj.aijdjy.com/course/13/task/266/show# https://www.yuque.com/books/share/0729cafa-4751-40e5-9f5d-bb617c0e9708?# 《C》 💻 AI算法视角下的c 视频问手写ai vx: shouxie_ai [共11节课,每节课…

keepalived脑裂现象

Keepealived最常见的问题是会出现脑裂现象: Master一直发送心跳消息给backup主机,如果中间的链路突然断掉,backup主机将无法收到master主机发送过来的心跳消息(也就是vrrp报文),backup这时候会立即抢占mas…

Spring Cloud Gateway 限流

在高并发的应用中,限流是一个绕不开的话题。限流可以保障我们的 API 服务对所有用户的可用性,也可以防止网络攻击。 一般开发高并发系统常见的限流有:限制总并发数(比如数据库连接池、线程池)、限制瞬时并发数&#xf…

『python爬虫』10. 数据解析之xpath解析(保姆级图文)

目录 安装库xpath入门怎么快速得到xpath路径xpath节点的关系xpath方法小型实战总结 欢迎关注 『python爬虫』 专栏,持续更新中 欢迎关注 『python爬虫』 专栏,持续更新中 安装库 pip install lxmlxpath入门 怎么快速得到xpath路径 (相对路…

安装gitea

1、安装包(gitea-1.13.1-linux-amd64)上传到服务器,并添加执行权限 链接:https://pan.baidu.com/s/1SAxko0RhVmmD21Ev_m5JFg 提取码:ft07 chmod x gitea-1.13.1-linux-amd64 2、执行 ./gitea-1.13.1-linux-amd64 web…

Django如何使用templates显示网页和静态资源

Django templates and static 什么是templates? 在我们访问Django的url时,有时我们想返回html文件,但是这些文件不能随便放置, 我们就需要放到templates文件夹中,tamplates文件夹可以创建到每一个app中, 也可以创建…

AXI协议相关概念(一)

猝发(Burst) 拍(beat):在时钟采样沿valid和ready信号同时拉高持续一个时钟周期,即为一拍,持续两个时钟周期,即为两拍,依次类推。可以概括为在时钟采样沿握手信号同时拉高…

Packet Tracer – 研究 VLAN 实施

Packet Tracer – 研究 VLAN 实施 地址分配表 设备 接口 IP 地址 子网掩码 默认网关 S1 VLAN 99 172.17.99.31 255.255.255.0 不适用 S2 VLAN 99 172.17.99.32 255.255.255.0 不适用 S3 VLAN 99 172.17.99.33 255.255.255.0 不适用 PC1 NIC 172.17.10.2…