C++不完整类型incomplete type 浅析

2023-11-11

C++不完整类型incomplete type 浅析

类型定义:
The following are incomplete types:
• Type void
• Array of unknown size
• Arrays of elements that are of incomplete type
• Structure, union, or enumerations that have no definition
• Pointers to class types that are declared but not defined
• Classes that are declared but not defined

代码示例:

•	template<class T> inline void checked_delete(T* x)  
•	{  
•	  typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];  
•	  (void) sizeof(type_must_be_complete);  
•	  delete x;  
•	}  
•	  
•	template<class T> inline void checked_array_delete(T* x)  
•	{  
•	  typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];  
•	  (void) sizeof(type_must_be_complete);  
•	  delete[] x;  
•	}

    分析:这两个函数是函数模版,在编译时无法确定参数的类型,而动态运行时的错误是比较棘手的,所以用这行来将运行时错误转变为编译期错误。这句话其实就是定义了一个固定大小的char型数组,数组名为type_must_be_complete,数组大小是多少呢?sizeof(T)?1:-1, ?:这个三元操作符大家都很熟悉了,若sizeof(T)非0,这个表达式的值为1,即typedef了一个大小为1的char型数组,否则定义一个大小为-1的数组。数组大小还能为负数?当然不能,于是就会报错,而且是编译期错误,于是就将一个动态运行时错误在编译时就发现了。前向声明就是:可以声明一个类而不定义它。

     class Screen;//declaration of the Screen class

    这个声明,有时候被称为前向声明(forward declaration),在程序中引入了类类型的Screen。在声明之后,定义之前,类Screen是一个不完全类型(incompete type),即已知Screen是一个类型,但不知道包含哪些成员.不完全类型只能以有限方式使用,不能定义该类型的对象,不完全类型只能用于定义指向该类型的指针及引用,或者用于声明(而不是定义)使用该类型作为形参类型或返回类型的函数.为什么:这是因为不知道这个类型的占用的空间大小(void)强制类型转换,消除编译器对未使用sizeof返回值的警告。GCC对于incomplete type使用sizeof时,会返回0。总结incomplete type就是那些声明了,但没有定义的类型。
    C++声明了一个函数可以不进行定义,只要这个函数只用在不求值的场合(unevaluated context),也就是没有可能被执行,也没有被取地址。C++11标准库就包含一个没有定义的函数(确切的说是函数模板)。
template< class T >typename std::add_rvalue_reference<T>::type declval();

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++不完整类型incomplete type 浅析 的相关文章

随机推荐

  • PowerOJ2512: 小红灌溉【染色】

    题目链接 划重点 每个有菜的点只能浇一次且恰好一次 所以意思就是 譬如某个菜的位置是 x y 那么 行x 列y的浇水方案只能使用其中的一个 以此类推 我们给每个有蔬菜的位置的 x y 的x点与y点链接一条无向边 代表x和y只能选择其中的一个
  • MySQL5.7.xx安装卡在Staring the server解决方案--亲测有效

    安装mysql时卡在Staring the server 一般是两个问题 之前安装过mysql 卸载不彻底 你的电脑名称中有中文 我当时用在网上查找的方法 将mysql删除之后 依旧卡在Staring the server这个地方 接着重新
  • 《数据分析原理》:6步解决业务分析难题

    点击上方卡片关注我 回复 8 加入数据分析 领地 一起学习数据分析 持续更新数据分析学习路径相关资料 精彩数据观点 学习资料 数据课程分享 读书会 分享会等你一起来乘风破浪 回复 小飞象 领取数据分析知识大礼包 读书交流 7期 数据分析原理
  • IntelliJ IDEA 下载安装教程,超详细图文教程

    1 IDEA 下载 1 打开浏览器输入https www jetbrains com 进入 Jetbrains官网 点击 Developer Tools 再点击 Intellij IDEA 2 点击中间的 Download 进入IDEA下载
  • 分割预研 -- 2022.5

    MMSegmentation MMSegmentation 标准统一的语义分割框架 非常好的分割开源集成框架 https link zhihu com target https 3A github com open mmlab mmsegm
  • 基于 FBXSDK-Python 的动画操作

    PythonFBXSKD 01 基础的动画操作 1 0 下载安装 FBXSDK 我这里演示的是 FBXSDK 2020 2 只有 py37 版本的 FBXSDK 2020 1 1 版本有 py27 和py33 两个版本 根据自己的pytho
  • kubernetes的configmap格式错乱问题

    一 问题 最近发现configmap资源在查看 o yaml 或者修改 edit 时 存在格式错乱问题 以nginx配置文件为例 通过
  • 点对点隧道协议—PPTP部署配置

    1 虚拟专用网 1 1 PPTP介绍 PPTP Point to Point Tunneling Protocol 即点对点隧道协议 该协议是在PPP协议的基础上开发的一种新的加强型安全协议 支持多协议虚拟专用网 能够经过密码验证协议 PA
  • 微服务方法论02--服务划分规则01

    背景 现在微服务比较流程 那么对于微服务的拆分方法也比较让人困惑 本文从不同的角度切入后以系统的 全面的 统一的方式为各位介绍服务拆分的问题 问题定义 服务划分具体的问题在哪里 服务划分是对于具体技术的选择 是选择使用纵向切割的方式 还是使
  • Java集合详解——TreeSet集合的介绍及其排序

    一 TreeSet集合的自动排序 TreeSet集合的继承结构图 1 TreeSet集合使用红黑树数据结构实现元素的排序和存储 底层实际上是一个TreeMap集合 2 Tree Map集合底层实际上是一个二叉树 3 放到TreeSet集合中
  • oVirt虚拟化平台下重置windows10虚拟机的一次神奇体验

    前言 公司一台win10虚拟机密码被改掉了 尝试各种方式无解 密码都不对 这台机器上数据还比较多 于是有了下面的探索 1 重启机器 2 ovirt平台控制台进入机器 点击输入密码 3 按5次Shift键 4 文件 运行新任务 输入cmd 5
  • gitee错误failed to push some refs to

    问题说明 当我们在github版本库中发现一个问题后 你在github上对它进行了在线的修改 或者你直接在github上的某个库中添加readme文件或者其他什么文件 但是没有对本地库进行同步 这个时候当你再次有commit想要从本地库提交
  • 【STM32】HAL库-ADC

    12位ADC是一种逐次逼近型模拟数字转换器 它有多达18个通道 可测量16个外部和2个内部信号源 各通道的A D转换可以单次 连续 扫描或间断模式执行 ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中 模拟看门狗特性允许应用程序检
  • 商业数据分析的模型

    2 1 KANO分析模型 KANO模型是东京理工大学教授狩野纪昭 Noriaki Kano 发明的对用户需求分类和优先排序的有用工具 该模型是受行为科学家赫兹伯格的双因素理论启发而提出的 体现了产品性能和用户满意之间的非线性关系 主要是通过
  • L3HCTF2021几道简单的签到题

    L3HCTF2021几道简单的签到题 Misc Welcome Web Image1 Web EasyPHP 作者 Hopeace Misc Welcome 第一次做misc的题目 迷迷糊糊的注册之后 进去好像是个聊天室类似的东西 随便点点
  • 学习C语言第6天打卡

    练习1 斐波那契数列 include
  • 数学:关于对向量、矩阵求导常见公式

    对向量 矩阵求导 和对标量求导还是有点区别 特别是转置和不转置 在网上参考了其他资料整理一下 介绍 在矩阵求导中 分为两种布局 分别是分子布局 Numerator Layout 和分母布局 Denominator Layout 考虑 x y
  • 2023年程序员八股文-集群

    一 负载均衡 集群中的应用服务器 节点 通常被设计成无状态 用户可以请求任何一个节点 负载均衡器会根据集群中每个节点的负载情况 将用户请求转发到合适的节点上 负载均衡器可以用来实现高可用以及伸缩性 高可用 当某个节点故障时 负载均衡器会将用
  • O-RAN专题系列-35:管理面-WG4.MP.V07-规范解读-第2章-总体架构

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 122473075 目录 第2章 高层的
  • C++不完整类型incomplete type 浅析

    C 不完整类型incomplete type 浅析 类型定义 The following are incomplete types Type void Array of unknown size Arrays of elements tha